为连接模型设置多对多关联的一侧的类型

时间:2010-11-25 03:17:16

标签: ruby-on-rails ruby-on-rails-3 many-to-many associations has-many-through

我设置了一个公共github应用程序(请参阅:https://github.com/greenplastik/testapp进行下载)以解决我在两个模型之间的多对多关联的一侧指定类型的问题,通过一个连接模型。

鉴于Person和Book模型以及Book_Person连接模型,我希望能够执行以下操作:

@book = Book.first @ book.people#列出人的书 @ book.authors#列出了书籍的作者类型的人 @ book.editors#列出了书籍的编辑人员

@person = Person.first @ person.books#为人们列出书籍

此应用程序部分使用Google提供的说明进行设置。在我的testapp的自述文件中有指向这些说明的链接。

尽我所能,我尝试删除不一致和拼写错误。我无法让它发挥作用。

任何帮助将不胜感激。我已经包含了sqlite数据库,以便于您进行更简单的测试。

1 个答案:

答案 0 :(得分:0)

对不起,我没有时间发布完整的解决方案或经过测试的解决方案,但这至少应该让你走上正轨......

实现您正在寻找的内容的最佳方法是使用单表继承与多态关系。

我建议将作者和编辑器重新定义为Person的子类

class Person < ActiveRecord::Base
  has_many :book_people
  has_many :books, :through => :book_people
end


class Author < Person
end

class Editor < Person
end

class BookPerson < ActiveRecord::Base
  belongs_to :person, :polymorphic => true
  belongs_to :book
end

class Book < ActiveRecord::Base
  has_many :book_people
  has_many :people, :through => :book_people
  has_many :authors, :through => :book_people, :source => :person, :source_type => "Author"
  has_many :editors, :through => :book_people, :source => :person, :source_type => "Editor"
end

然而,如果一个人可以填补所有三个角色,那么这将是次优的。通过对其中三个使用相同的STI名称,可能有一种解决方法。但是你要让查询所有作者变得更加困难。