一个模型中的多个一对多关联

时间:2009-08-31 09:28:01

标签: ruby-on-rails activerecord model

给定两个模型类FooBar,我希望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中创建这种类型的关联?

3 个答案:

答案 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_idprop_c_id”的列,它可以存储作为Bar表主键的整数。

但是,此解决方案不会处理ActiveRecord关联下面列出的问题。对于上面提出的解决方案,您需要查看Rails和单表继承。如果你谷歌这个你可以找到很多资源。就个人而言,我推荐使用Rails进行敏捷Web开发。在第3版中,您可以在第377页找到它。此外,STI上有一篇很好的初学者报告here

祝你好运!

答案 2 :(得分:0)