0

2 つのテーブルと結合テーブルがあります。

モデル 1:

class Book < ActiveRecord::Base
  has_many :book_people
  has_many :illustrators, through: :book_people, class_name: 'ComaPerson', foreign_key: 'illustrator_id'
  has_many :authors, through: :book_people, class_name: 'ComaPerson', foreign_key: 'author_id'

結合テーブル:

class BookPerson < ActiveRecord::Base
  belongs_to :book
  belongs_to :illustrator, class_name: 'ComaPerson', foreign_key: 'illustrator_id'
  belongs_to :author, class_name: 'ComaPerson', foreign_key: 'author_id'

モデル2(私に問題を与えているもの):

class ComaPerson < ActiveRecord::Base
  has_many :book_people #<-- not working
  has_many :books, :through => :book_people

BookPerson モデルに coma_person_id 列がないため、私のテストは失敗しています。

Failures:

  1) ComaPerson should have many book_people
     Failure/Error: it { should have_many(:book_people) }
       Expected ComaPerson to have a has_many association called book_people (BookPerson does not have a coma_person_id foreign key.)
     # ./spec/models/coma_person_spec.rb:5:in `block (2 levels) in <top (required)>'

ComaPerson はイラストレーターまたは著者のいずれかになる可能性があるため、結合テーブルでillustrator_idandを使用しauthor_idたため、結合テーブルには「book_id、illustrator_id、および author_id」の 3 つの列があります。それが機能するには、coma_person_id 列を結合テーブルに追加する必要があるということですか?

4

1 に答える 1

2

私はそれを理解したと思います。したがってhas_many :join_table_name、モデル名と外部キーが何であるかを指定しながら、をマスクして、各foreign_keyに1つずつ、2つに分割する必要があります。

class ComaPerson < ActiveRecord::Base
  has_many :authored_books_people, class_name: 'BookPerson', foreign_key: 'author_id'
  has_many :illustrated_book_people, class_name: 'BookPerson', foreign_key: 'illustrator_id'
  has_many :authored_books, through: :authored_books_people, primary_key: 'author_id', source: :book
  has_many :illustrated_books, through: :illustrated_book_people, primary_key: 'illustrator_id', source: :book
于 2013-11-14T17:33:55.970 に答える