8

Dr.Nic のレール用複合主キー (http://compositekeys.rubyforge.org/) を使用しています。

例では、彼は has_many と belongs_to 関係を持っていますが、has_and_belongs_to_many は持っていません

私の関連付けは、書籍からジャンル (書籍にはタイトルと著者の複合基本キーがあります) にうまくいきますが、ジャンルから書籍へは、結合テーブルに存在しない列 book_id をクエリしようとし、エラーが発生します。

class Book < ActiveRecord::Base
  self.primary_keys = :title, :author
  has_and_belongs_to_many :genres, foreign_key: [:title, :author]
end

class Genre < ActiveRecord::Base
  has_and_belongs_to_many :books, foreign_key: [:title, :author]
end

編集::association_foreign_keyジャンルモデルのオプションを使用して動作させることもできました

class Genre < ActiveRecord::Base
  has_and_belongs_to_many :books, association_foreign_key: [:title, :author]
end
4

1 に答える 1

8

Ruby on Rails Style Guide によると:

has_and_belongs_to_many よりも has_many :through を優先します。has_many :through を使用すると、結合モデルで追加の属性と検証が可能になります。

これはあなたの問題を解決します: has_many と belongs_to の関係のみがあり、HABTM はありません;)

あなたの場合:

class Book < ActiveRecord::Base
  self.primary_keys = :title, :author
  has_many :book_genre_relations
  has_many :genres, through: :book_genre_relations
end

class Genre < ActiveRecord::Base
  has_many :book_genre_relations
  has_many :books, through: :book_genre_relations
end

class BookGenreRelation < ActiveRecord::Base # Sorry but couldn't find a better name...
  belongs_to :book
  belongs_to :genre
end

私は複合主キーに詳しくありません。

于 2012-11-30T18:29:24.467 に答える