1. ホーム
  2. ruby-on-rails

Railsのhas_oneとbelongs_toの違い?[重複している]

2023-09-04 12:56:57

質問内容

私が理解しようとしているのは has_one の関係を理解しようとしています。

例えば、2つのモデル - PersonCell :

class Person < ActiveRecord::Base
  has_one :cell
end

class Cell < ActiveRecord::Base
  belongs_to :person
end

を使うだけでよいのでしょうか? has_one :person の代わりに belongs_to :personCell のモデルですか?

同じではありませんか?

どのように解決するのですか?

いいえ、両者は互換性がありませんし、実際にいくつかの違いがあります。

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つずつが必要で、それらは正しいクラスに入れなければなりません。一方向の関連付けの場合でも、どちらを使うかは重要です。