如何在同一个两个类之间进行多个has_and_belongs_to_many关联?

时间:2010-05-20 17:33:29

标签: ruby-on-rails has-and-belongs-to-many

我有以下设置:

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的错误。我怎么能解决这个问题?

我是否可以切换到作者和编辑的单独模型?然而,它会给数据库带来一些冗余,因为一个人可以是一个出版物的作者和另一个出版物的编辑。

2 个答案:

答案 0 :(得分:3)

你的关联的另一端应该被称为类似authored_publicationsedited_publications的东西,带有一个额外的只读publications访问器,它返回两者的并集。

否则,如果您尝试执行类似

之类的操作,则会遇到棘手的情况
person.publications << Publication.new

因为你永远不会知道这个人是作者还是编辑。并不是通过略微改变对象模型就无法解决这个问题。

你也可以在ActiveRecord中修改SQL查询或改变关联的行为,但也许只是保持简单?

答案 1 :(得分: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