需要有关rails中多态连接表的帮助

时间:2009-09-18 10:34:12

标签: ruby-on-rails ruby model

嗨,我正在尝试将两个实体链接到一个管理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' "

但是当我尝试保存时,它不会在连接表中保存任何内容..

任何人都可以帮助我

1 个答案:

答案 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可以附加到任何类型的记录。重要的是,它不是在关系中使用,而是一个终点。