質問

この質問に答えはこちら

私は理解しようと has_one 関係RoR.

ということかうまくいきませんモデル- 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はONLY外部キーを保持しているクラスで行くことができます。

has_oneは、このクラスを参照する別のテーブルの外部キーがあることを意味します。だから、has_oneはONLY別のテーブル内の列によって参照されるクラスで行くことができます。

これは間違っています:

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重要ます。

他のヒント

あなたは「BELONGS_TO」を追加した場合、

あなたは双方向関連を得ました。それはあなたがセルから、人と人からの細胞を得ることができることを意味します。

は本当の違い、両方のアプローチは、(とし、「belongs_toの」せずに)同じデータベーススキーマ(細胞のデータベーステーブルのPERSON_IDフィールド)を使用してありません。

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

使用あなたは人と細胞モデルの両方から情報を取得することができます両方ます。

@cell.person.whatever_info and @person.cell.whatever_info.
ライセンス: CC-BY-SA帰属
所属していません StackOverflow
scroll top