【问题标题】:Setting a type for one side of a many-to-many association with a join model使用连接模型为多对多关联的一侧设置类型
【发布时间】:2011-05-15 11:30:33
【问题描述】:

我设置了一个公共 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 的 README 中有指向这些说明的链接。

我尽我所能消除不一致和错别字。我无法让它工作。

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

【问题讨论】:

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


    【解决方案1】:

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

    实现您所寻找的最佳方式是使用单表继承与多态关系。

    我建议将 Author 和 Editor 重新定义为 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 名称来解决这个问题。但这样一来,查询所有作者就会变得更加困难。

    【讨论】:

    • 不幸的是,在执行“@book = Book.first”,然后执行“@book.people”时,您的解决方案产生了以下错误:“ActiveRecord::HasManyThroughAssociationPolymorphicError: Cannot have a has_many :through association多态对象“Person#person”上的“Book#people”。
    • 正如我在免责声明中所说,我没有时间测试它的正确性。有一种方法可以让它工作,它与这个解决方案中的内容相距不远,但我没有时间去摆弄它,直到它完成。
    • 我试过到处检查并阅读文档和源代码。没有喜悦。任何帮助的机会?
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多