给定两个模型类Foo
和Bar
,我希望Foo使用3个不同的属性名称对3个独立的Bar实例进行引用,并在Foo表上使用外键。 Bar将单独管理,可以属于Foo的许多实例。这有点解释了,显然has_one是错误的关联使用(我认为?):
Foo
has_one :prop_a, :class_name => "Bar"
has_one :prop_b, :class_name => "Bar"
has_one :prop_c, :class_name => "Bar"
Bar
有3种可能的Bar类型,由bar_type
字符串字段表示,Foo上的每个引用对应于其中一个。例如Foo.prop_a
引用了bar_type
='type_a'的Bar实例。如何在Rails中创建这种类型的关联?
答案 0 :(得分:1)
为什么不使用继承。您可以创建3个继承自Bar的类。您需要做的就是在数据库中有一个类型列。
class Foo
has_one :bara
has_one :barb
has_one :barc
end
class BarA < Foo
belongs_to :foo
end
class BarB < Foo
belongs_to :foo
end
class BarC < Foo
belongs_to :foo
end
然后迁移需要有bara_id,barb_id和barc_id列。
我没试过这个,但它应该有用。
one = Foo.new
two = BarA.new
three = BarB.new
four = BarC.new
one.bara = two
one.barb = three
one.barc = four
one.save
one.bara.foo #=> one
one.bara.bara = BarA.new
one.bara.bara.foo #=> two
答案 1 :(得分:1)
你说错了,这里使用了错误的关联。
在ActiveRecord中,他们模拟 外键总是belongs_to
另一个模型。
在这个场景中,类Foo实际上是belongs_to
那些道具
指定此方法的一种方法是:
class Foo < ActiveRecord::Base
belongs_to :prop_a, :class_name => "Bar", :foreign_key => "prop_a_id"
belongs_to :prop_b, :class_name => "Bar", :foreign_key => "prob_b_id"
belongs_to :prop_c, :class_name => "Bar", :foreign_key => "prob_c_id"
end
这意味着,您必须在Foo上有一个标题为“prop_a_id, prop_b_id
和prop_c_id
”的列,它可以存储作为Bar表主键的整数。
但是,此解决方案不会处理ActiveRecord关联下面列出的问题。对于上面提出的解决方案,您需要查看Rails和单表继承。如果你谷歌这个你可以找到很多资源。就个人而言,我推荐使用Rails进行敏捷Web开发。在第3版中,您可以在第377页找到它。此外,STI上有一篇很好的初学者报告here
祝你好运!答案 2 :(得分:0)