2016-12-16 5 views
2

誰かが私のコードが正しいと説明できますか?レイルアソシエーションでforeign_keyを使用するhas_many

私はrail_associationsでforeign_keyオプションを取得しようとしています。 ブック著者

帳のDBスキーマ:

は私がモデルを持っている

  • のuser_id

著者のDBスキーマ:

マイモデル:我々は両方のモデルでFOREIGN_KEYを定義する必要がある理由はここに

class Author < ApplicationRecord 
    has_many :books, foreign_key: :user_id 
end 

class Book < ApplicationRecord 
    belongs_to :author, foreign_key: :user_id 
end 

が、私は理解していません。それは必然ですか?

答えて

3

Railsが期待するテーブル名とカラム名を使用した場合、foreign_keyを明示的に定義する必要はありません。外部キー列がauthor_idと命名された場合は、あなたの場合、あなたは非常に単純で得ることができます:

class Author < ApplicationRecord 
    has_many :books 
end 

class Book < ApplicationRecord 
    belongs_to :author 
end 

しかし、あなたの場合には、外部キー列に名前が付いていないRailsが期待するものに応じて、あなたが持っているので、外部キー列名を明示的に定義する必要があります。それは問題ありませんが、それはもう少しあなたのために働きます。

外部キーを明示的に定義した場合は、両方の関連付けに対してそれを定義する必要があります。あなたのhas_manyの関連付けはそれなしでは動作しません。少数のクエリを作るためのActiveRecordを引き起こす可能性があります

class Author < ApplicationRecord 
    has_many :books, foreign_key: :user_id, inverse_of: :author 
end 

class Book < ApplicationRecord 
    belongs_to :author, foreign_key: :user_id, inverse_of: :books 
end 

inverse_ofの定義、およびいくつかの驚きの行動を取り除く:

はまた、あなたは逆相関を定義する必要があります。 inverse_ofの説明については、Exploring the :inverse_of Option on Rails Model Associations、Ryan Stenberg、

+0

を参照してください。あなたはモデルの著者(定義されたforeign_keyなし)はテーブルブックのauthor_idフィールドを探します。だから、foreign_keyを明示的に定義する必要があるのはなぜですか? –

+0

@DorianGそれは正しいです。私は答えにそれを加えました。 –

+1

@WayneConradありがとう!私はあなたの答えを見つける前に、厳密なテストを通して自分自身の外的キーの効果を自分自身で発見しました。今私は本当にその事件を感じることができます!うまくいけば、 ':inverse_of'オプションに関するあなたの他の懸念は、間違いなくたくさんの努力を惜しまないでしょう:)なぜこれがレールガイド/ apiで明確に説明されていないのか疑問に思います。 –

関連する問題