设置多个Tag类型的多对多关联?

时间:2013-06-23 10:50:35

标签: ruby-on-rails ruby-on-rails-3 ruby-on-rails-3.2 associations polymorphic-associations

在我的应用程序中,我有7个型号。我希望这样做,以便用户可以使用2种不同类型的标签来标记3种不同的模型。用户也属于所有这些模型。

User

2个标记模型为DogCat

可以包含代码的3个模型是StoreFarmHouse

比我有Tagging模型来制作连接表所以它是多对多的,因为我希望能够将Cat分配到商店,农场或商店。

我想知道下面的内容是否适合这种情况。我应该为每种类型的Tagging添加一个Tag联接表还是另一个联接表?那是狗和猫?

class User < ActiveRecord::Base
  has_many :dogs
  has_many :stores
  has_many :houses
  has_many :farms
  has_many :cats
  has_many :taggings
end

class Dog/Cat < ActiveRecord::Base
   belongs_to :user
   has_many :taggings
   has_many :houses, :through => :taggings, :source => :taggable, :source_type => "House" 
   has_many :farms, :through => :taggings, :source => :taggable, :source_type => "Farm" 
   has_many :stores, :through => :taggings, :source => :taggable, :source_type => "Store" 
end

class House/Farm/Store < ActiveRecord::Base
  belongs_to :user
  has_many :taggings
  has_many :dogs, :through => :taggings, :source => :taggable, :source_type => "Dog" 
  has_many :cats, :through => :taggings, :source => :taggable, :source_type => "Cat" 
end

class Tagging < ActiveRecord::Base
  attr_accessible :taggable_id, :taggable_type
  belongs_to :dog
  belongs_to :cat
  belongs_to :user
  belongs_to :taggable, :polymorphic => true
end

# Tagging Table

create_table :taggings do |t|
   t.integer :dog_id
   t.integer :cat_id
   t.integer :user_id
   t.integer :taggable_id
   t.string  :taggable_type
end

1 个答案:

答案 0 :(得分:1)

对您的设计的一些想法

为什么用户必须拥有标签?

似乎动物是标签的真正所有者。当看到动物归用户所有时,将用户与标签相关联似乎是多余的。

标签不属于狗或猫,属于动物。

看作标签只能由猫或狗拥有,将两者都称为外键似乎不直观。如果你以后再加一只兔子,你会再做一次关联吗?我会探索一种多态解决方案,其中标签属于动物。这将自动消除属于猫和狗的一个标签的担忧。

相关问题