我设置了一个公共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数据库,以便于您进行更简单的测试。
答案 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名称,可能有一种解决方法。但是你要让查询所有作者变得更加困难。