Rails如何在相同类型的has_many关系中维护has_one关系

时间:2016-03-01 17:25:25

标签: ruby-on-rails activerecord

在我正在进行的项目中,我注意到如果我有has_onehas_many引用相同类型的对象,那么Rails可以区分被引用为{的对象{1}}以及后续控制台会话中引用为has_one的对象。

例如,采用以下两种模式:

has_many

如果我在class Foo has_many :bars has_one :bar end class Bar belongs_to :foo end 属性中创建了一个Foo类型的新记录,其中包含一组Bar个实例和一个单独的Bar实例,然后重新启动我找到的控制台原始Foo#bar实例仍将单独的Foo实例引用为Bar。该单独的实例现在显示在bar返回的Bar实例列表中。这是正常行为还是有点侥幸?

2 个答案:

答案 0 :(得分:0)

这是正常行为,因为has_manyhas_one在DB中具有相同的概念,它们是0 ... n(零到多)其他的关系!

但不同的意思是:

  • has_one的含义为0..1,否则has_many0..n,您会看到n maybe equal 1
  • 此外,has_one& has_many帮助栏了解您正在为查询做些什么,例如:

<强> Foo.first.bar

=> SELECT  "bars".* FROM "bars" WHERE "bars"."foo_id" = $1 LIMIT 1  [["foo_id", 234]]

Foo.first.bars (不限制1)

=> SELECT  "bars".* FROM "bars" WHERE "bars"."foo_id" = $1 [["foo_id", 234]]

答案 1 :(得分:0)

您可以尝试这样的事情:

class Foo
  has_many :bars
end


class Bar
  belongs_to :foo
  belongs_to :foo_single, :foreign_key=>"foo_single_id", :class_name=>"Foo" 
end

通过这样做,你会将“条形”分开。如果一个条形图有一个foo_single_id,则表示您正在查找一对一的关系。如果Bar有一个foo_id,那么它就是1对多。

需要为Foo has_one栏关系完成。