RoRのhas_one
関係を理解しようとしています。
Person
とCell
の2つのモデルがあるとします。
class Person < ActiveRecord::Base
has_one :cell
end
class Cell < ActiveRecord::Base
belongs_to :person
end
Cell
モデルでhas_one :person
の代わりにbelongs_to :person
を使用できますか?
同じじゃない?
いいえ、それらは互換性がなく、いくつかの本当の違いがあります。
belongs_to
は、外部キーがこのクラスのテーブルにあることを意味します。したがって、belongs_to
は、外部キーを保持するクラスにのみ入れることができます。
has_one
は、このクラスを参照する別のテーブルに外部キーがあることを意味します。したがって、has_one
は、別のテーブルの列によって参照されるクラスにのみ入れることができます。
これは間違っています:
class Person < ActiveRecord::Base
has_one :cell # the cell table has a person_id
end
class Cell < ActiveRecord::Base
has_one :person # the person table has a cell_id
end
そして、これも間違っています:
class Person < ActiveRecord::Base
belongs_to :cell # the person table has a cell_id
end
class Cell < ActiveRecord::Base
belongs_to :person # the cell table has a person_id
end
正しい方法は次のとおりです(Cell
にperson_id
フィールドが含まれる場合):
class Person < ActiveRecord::Base
has_one :cell # the person table does not have 'joining' info
end
class Cell < ActiveRecord::Base
belongs_to :person # the cell table has a person_id
end
双方向の関連付けでは、それぞれ1つが必要であり、適切なクラスに参加する必要があります。一方向の関連付けであっても、どちらを使用するかは重要です。
「belongs_to」を追加すると、双方向の関連付けが得られます。つまり、セルから人を取得し、人からセルを取得できます。
実際の違いはありません。両方のアプローチ( "belongs_to"の有無にかかわらず)は同じデータベーススキーマ(セルデータベーステーブルのperson_idフィールド)を使用します。
要約すると、モデル間の双方向の関連付けが必要でない限り、「belongs_to」を追加しないでください。
両方を使用すると、PersonモデルとCellモデルの両方から情報を取得できます。
@cell.person.whatever_info and @person.cell.whatever_info.