嗨,我正在尝试将两个实体链接到一个管理body,estate和repo_document的实体,然后一个管理机构可以拥有该庄园也可以拥有的repo_document,所以我决定创建一个名为document_owner的连接表..但是我不知道在他们的模型中写什么..我已经在我的document_owner模型中得到了这个代码..
belongs_to :repo_document belongs_to :estate, :through => :repo_document, :foreign_key => :owner_id, :conditions => "owner_type = 'Estate'" belongs_to :governing_body, :through => :repo_document, :foreign_key => :owner_id, :conditions => "owner_type = 'GoverningBody'" belongs_to :owner, :polymorphic => true
和我的repo_document中的这个
has_and_belongs_to_many :owners, :join_table => :document_owners, :conditions => "owner_type = 'Estate' OR owner_type = 'GoverningBody'"
这个在我的遗产中
has_many :repo_documents, :source => :document_owners, :foreign_key => :owner_id, :conditions => "owner_type = 'Estate' "
和我在govern_body中的这个
has_many :repo_documents, :source => :document_owners, :foreign_key => :owner_id, :conditions => "owner_type = 'GoverningBody' "
但是当我尝试保存时,它不会在连接表中保存任何内容..
任何人都可以帮助我
答案 0 :(得分:5)
就像建议一样,我认为多态连接表是一个非常糟糕的主意,除非严格必要,否则应该避免。它们不仅难以正确索引,而且它们会使涉及它们的每个查询都更复杂一些,而且难以扩展。理想情况下,您拥有的任何多态关联永远不会用于将两个表连接在一起。
此外,不推荐使用has_and_belongs_to_many,如果在大多数情况下使用has_many:through是一个更好的解决方案。
简化此操作的一种方法是将您的Estate和GoverningBody模型组合到一个表中,可能使用STI来区分这两者。这样,文档与这个特定实体之间的关系就更加明显了。
如果那不实用,那么你可能最好有两个简单的连接表而不是多态连接表。
多态关联最适合一对多的偶然关系。例如:
class Example < ActiveRecord::Base
# This model has notes
has_many :notes, :as => :record
end
class Note
# Can be attached to any kind of record
belongs_to :record, :polymorphic => true
end
在这种情况下,Note可以附加到任何类型的记录。重要的是,它不是在关系中使用,而是一个终点。