差has_oneとbelongs_toレール?[重複]
-
21-08-2019 - |
質問
この質問に答えはこちら
私は理解しようと has_one
関係RoR.
ということかうまくいきませんモデル- Person
や Cell
:
class Person < ActiveRecord::Base
has_one :cell
end
class Cell < ActiveRecord::Base
belongs_to :person
end
できるだけ利用 has_one :person
の代わりに belongs_to :person
に Cell
モデルかどうかを示します。
なので"は同一者でもいいですか?
解決
いいえ、彼らは交換可能ではない、といくつかの実際の違いがあります。
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
正しい方法である(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の」せずに)同じデータベーススキーマ(細胞のデータベーステーブルのPERSON_IDフィールド)を使用してありません。
要約すると:あなたはモデル間の双方向の関連付けを必要としない限り、「BELONGS_TO」を追加しないでください。
使用あなたは人と細胞モデルの両方から情報を取得することができます両方ます。
@cell.person.whatever_info and @person.cell.whatever_info.