Ruby on rails 设置与多个标记类型的多对多关联?
在我的应用程序中,我有7个模型。我想让用户可以使用2种不同类型的标签来多次标记3种不同的型号。用户也属于所有这些型号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
用户
这两种标签型号是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数据库是否适合您的应用程序。