单独的多态关联表

时间:2011-12-07 20:30:06

标签: ruby-on-rails activerecord associations polymorphic-associations has-many-polymorphs

阅读Ruby on Rails指南和一些有关多态关联问题的stackoverflow响应后,我了解它的用法和实现,但我对特定的使用场景有疑问。我tags可以与多个topicscategoriesimages和其他各种模型(也有不同的tags)关联,但不是放置foreign_id表中的引用字段(foreign_typetags),我更愿意创建一个单独的关联表。这仍然可以使用:polymorphic => true吗?

这样的事情:

create_table :tags do |t|
  t.string :name
  t.remove_timestamps
end

create_table :object_tags, :id => false do |t|
  t.integer :tag_id
  t.references :tagable, :polymorphic => true
  t.remove_timestamps
end

如果无法做到这一点,我计划创建相同的:object_tags表,并在:conditions模型和其他模型中使用Tag来强制关联。这样做有轨道吗?谢谢! (使用rails 3.0.9& ruby​​ 1.8.7< - 因为部署服务器仍在使用1.8.7)

更新 谢谢Delba! Answer是HABTM多态性的有效解决方案。

class Tag < ActiveRecord::Base
  has_many :labels
end

class Label < ActiveRecord::Base
  belongs_to :taggable, :polymorphic => true
  belongs_to :tag
end

class Topic < ActiveRecord::Base
  has_many :labels, :as => :taggable
  has_many :tags, :through => :labels
end

create_table :tags, :timestamps => false do |t|
  t.string :name
end

create_table :labels, :timestamps => false, :id => false do |t|
  t.integer :tag_id
  t.references :taggable, :polymorphic => true
end

更新:因为我需要双向HABTM,所以我最终还是要创建单独的表格。

1 个答案:

答案 0 :(得分:1)

是的,根据您的描述,您无法在标记上显示可标记的列,因为它们可以有多个可标记的内容,反之亦然。你提到过HABT,但是你不能做任何事情,比如has_and_belongs_to,:polymorphic =&gt;据我所知,这是真的。

create_table :object_tags, :id => false do |t|
  t.integer :tag_id
  t.integer :tagable_id
  t.string  :tagable_type
end

您的其他表不需要object_tags,tags或tagable的任何列。

class Tag < ActiveRecord::Base
  has_many :object_tags
end

class ObjectTag < ActiveRecord::Base
  belongs_to :tagable, :polymorphic => true
  belongs_to :tag
end

class Topic < ActiveRecord::Base
  has_many :object_tags, :as => :tagable
  has_many :tags, :through => :object_tags
end