Ruby on rails 设置与多个标记类型的多对多关联?

Ruby on rails 设置与多个标记类型的多对多关联?,ruby-on-rails,ruby-on-rails-3,ruby-on-rails-3.2,associations,polymorphic-associations,Ruby On Rails,Ruby On Rails 3,Ruby On Rails 3.2,Associations,Polymorphic Associations,在我的应用程序中,我有7个模型。我想让用户可以使用2种不同类型的标签来多次标记3种不同的型号。用户也属于所有这些型号 用户 这两种标签型号是Dog和Cat 有标签的三种型号是商店,农场,房子 然后我有了标记模型来创建联接表,所以它是多对多的,因为我希望猫能够被分配到商店、农场或房子 我想知道我下面所说的是否是这个场景的正确方法。我应该有一个标签联接表还是为每种类型的标签制作另一个?那是狗和猫 class User < ActiveRecord::Base has_many :dogs

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

用户

这两种标签型号是
Dog
Cat

有标签的三种型号是
商店
农场
房子

然后我有了
标记
模型来创建联接表,所以它是多对多的,因为我希望猫能够被分配到商店、农场或房子

我想知道我下面所说的是否是这个场景的正确方法。我应该有一个
标签
联接表还是为每种类型的
标签
制作另一个?那是狗和猫

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
class用户:taggings,:source=>:taggable,:source\u type=>“House”
有多个:farms,:through=>:taggings,:source=>:taggable,:source\u type=>“Farm”
有多个:存储区,:至=>:taggings,:source=>:taggable,:source\u type=>“存储区”
结束
类房屋/农场/商店:taggings,:source=>:taggable,:source\u type=>“Dog”
有很多:cats,:through=>:taggings,:source=>:taggable,:source\u type=>“Cat”
结束
类标记true
结束
#标记表
创建表格:标记不可用|
t、 整数:dog_id
t、 整数:cat_id
t、 整数:用户id
t、 整数:tagu id
t、 字符串:标记类型
结束
关于您的设计的一些想法 为什么用户必须拥有标签? 看来这些动物才是这些标签的真正主人。鉴于动物归用户所有,将用户与标签联系起来似乎是多余的

这些标签不属于狗或猫,它们属于动物。
由于标签只能归猫或狗所有,所以将两者都称为外键似乎并不直观。如果你以后再加一只兔子,你会再联系一次吗?我将探索一种多态性解决方案,其中标签属于动物。这将自动消除一个标签同时属于猫和狗的问题。

你的猫和狗与另一个有什么不同?@ThomasKleem他们非常不同,到目前为止,
cat
dog
分别有5列和3列。标签到底是什么?它代表什么?@NielsB。狗和猫的标签和标签本身就是狗或猫和房子/农场或商店之间的连接表。狗和猫能共用同一栋楼吗?我仍然很困惑。我确实在上面有一个多态关联。如果仅使用一个模型进行正常标记,则狗和猫可能与标记相同。但是,在我的例子中,我有两个
Tag
模型,分别称为
Cat
Dog
。我使用
标记
作为连接表,这个表用于这两个表只是为了简化事情,所以我不必制作两个
标记
表-一个用于
,一个用于
。我还希望标签上有一个真正的主人,因为关于
的信息将是主人。这些模型的专栏比我展示的要多。我完全重新定义了我的问题,以理解我的意思。我可能会和你走同样的路线,除了我会让标签的所有者(猫/狗)成为多态关联,就像我写的那样。它将使你的代码更简单,因为你不必检查猫或狗的存在,你可以只做@标签。动物,我也会考虑继承选项。商店、农场或房屋可以统一在一个建筑超类下吗?如果您担心性能,您可能想问问自己,SQL数据库是否适合您的应用程序。