4

私は次の設定をしています:

class Publication < ActiveRecord::Base
  has_and_belongs_to_many :authors, :class_name=>'Person', :join_table => 'authors_publications'
  has_and_belongs_to_many :editors, :class_name=>'Person', :join_table => 'editors_publications'
end

class Person < ActiveRecord::Base
  has_and_belongs_to_many :publications
end

この設定で、私はのようなことをすることができますPublication.first.authors。しかし、人が関与しているすべての出版物を一覧表示したい場合はPerson.first.publications、結合テーブルが見つからないというエラーがpeople_publicationsスローされます。どうすれば修正できますか?

著者と編集者のために別々のモデルに切り替える必要がありますか?ただし、人はある出版物の著者であり、別の出版物の編集者である可能性があるため、データベースにある程度の冗長性が導入されます。

4

2 に答える 2

3

アソシエーションのもう一方の端は、おそらく、2つの和集合を返す追加の読み取り専用アクセサーのようなものauthored_publicationsと呼ばれる必要があります。edited_publicationspublications

そうしないと、次のようなことをしようとすると、厄介な状況に遭遇します

person.publications << Publication.new

その人が著者なのか編集者なのかわからないからです。オブジェクトモデルを少し変更するだけでは、これを別の方法で解決できなかったわけではありません。

SQLクエリを変更したり、関連付けの動作を変更したりするためにActiveRecordで実行できるハックもありますが、単純に保つだけでよいでしょうか。

于 2010-05-20T17:41:19.383 に答える
0

personモデルに別の関連付けが必要だと思います

class Person < ActiveRecord::Base 
  # I'm assuming you're using this names for your foreign keys
  has_and_belongs_to_many :author_publications, :foreign_key => :author_id
  has_and_belongs_to_many :editor_publications, :foreign_key => :editor_id
end 
于 2010-05-20T23:43:31.383 に答える