web-dev-qa-db-ja.com

Railsのhas_oneとbelongs_toの違いは?

RoRのhas_one関係を理解し​​ようとしています。

PersonCellの2つのモデルがあるとします。

class Person < ActiveRecord::Base
  has_one :cell
end

class Cell < ActiveRecord::Base
  belongs_to :person
end

Cellモデルでhas_one :personの代わりにbelongs_to :personを使用できますか?

同じじゃない?

69
Moon

いいえ、それらは互換性がなく、いくつかの本当の違いがあります。

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

正しい方法は次のとおりです(Cellperson_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つが必要であり、適切なクラスに参加する必要があります。一方向の関連付けであっても、どちらを使用するかは重要です。

158
Sarah Mei

「belongs_to」を追加すると、双方向の関連付けが得られます。つまり、セルから人を取得し、人からセルを取得できます。

実際の違いはありません。両方のアプローチ( "belongs_to"の有無にかかわらず)は同じデータベーススキーマ(セルデータベーステーブルのperson_idフィールド)を使用します。

要約すると、モデル間の双方向の関連付けが必要でない限り、「belongs_to」を追加しないでください。

11
Pablo Fernandez

両方を使用すると、PersonモデルとCellモデルの両方から情報を取得できます。

@cell.person.whatever_info and @person.cell.whatever_info.
7
Jarrod