代码之家  ›  专栏  ›  技术社区  ›  Hermine D.

我该如何做多重has ou和ou属于同一两个类之间的多个关联?

  •  4
  • Hermine D.  · 技术社区  · 14 年前

    我有以下设置:

    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 回复  |  直到 14 年前
        1
  •  3
  •   Jim Puls    14 年前

    你的联想的另一端应该叫做 authored_publications edited_publications 带有额外的只读 publications 返回二者的并集的访问器。

    否则,如果你试图做一些像

    person.publications << Publication.new
    

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

    您还可以在ActiveRecord中执行一些黑客操作来更改SQL查询或更改关联的行为,但可能只是保持简单?

        2
  •  0
  •   Ju Nogueira    14 年前

    我相信你应该在 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