单独的多态关联表



在阅读了Ruby on Rails指南和一些关于多态关联问题的stackoverflow回答后,我理解了它的使用和实现,但是我有一个关于特定使用场景的问题。我有tags,可以与多个topics, categories, images和其他各种模型(也有不同的tags)相关联,但不是将参考字段(foreign_id, foreign_type)放在tags表中,我更愿意创建一个单独的关联表。

使用: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表,并在Tag模型和其他模型中使用:conditions来强制关联。有什么可行的方法吗?谢谢!(使用rails 3.0.9 &Ruby 1.8.7 <——因为部署服务器仍在使用1.8.7)

更新:谢谢Delba !答案是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

UPDATE:因为我需要双向HABTM,我最终回到创建单独的表。

是的,从你的描述,你不能有标签列在你的标签,无论如何,因为他们可以有多个标签的东西,反之亦然。你提到了习惯,但你不能做任何像has_and_belongs_to,:多态=> true据我所知。

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

相关内容

  • 没有找到相关文章

最新更新