77

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

2 つのモデルがあるとしましょう -PersonCell:

class Person < ActiveRecord::Base
  has_one :cell
end

class Cell < ActiveRecord::Base
  belongs_to :person
end

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

それは同じではありませんか?

4

3 に答える 3

179

いいえ、それらは交換可能ではなく、いくつかの実際の違いがあります。

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つが必要であり、適切なクラスに所属する必要があります。一方向の関連付けであっても、どちらを使用するかは重要です。

于 2009-05-14T06:51:14.077 に答える
15

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

実際の違いはありません。両方のアプローチ (「belongs_to」を使用する場合と使用しない場合) は、同じデータベース スキーマ (cells データベース テーブルの person_id フィールド) を使用します。

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

于 2009-05-14T01:52:30.237 に答える
7

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

@cell.person.whatever_info and @person.cell.whatever_info.
于 2009-05-14T01:31:39.460 に答える