2016-03-01 61 views
0

在我目前正在研究的项目中,我注意到如果我有一个has_one和一个has_many引用相同类型的对象,则Rails可以区分在后续控制台会话中被引用为has_one的对象和被引用为has_many的对象。Rails如何沿同一类型的has_many关系保持has_one关系

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

class Foo 
    has_many :bars 
    has_one :bar 
end 


class Bar 
    belongs_to :foo 
end 

如果我创建Foo类型的新纪录,一组Bar实例和一个独立的Bar实例在Foo#bar属性,然后重新启动控制台我发现原始Foo实例仍参考单独的Bar实例作为bar。该单独的实例现在出现在由Foo#bars返回的Bar实例列表中。这是正常的行为还是有点侥幸?

+0

你想通过这样做完成什么?这可能会导致'bar'关联的相当不可预知的结果,因为您不能100%确定_which_记录将从该集合返回。 –

+0

这正是我所怀疑的,而且我已经在为我的has_one关系定义不同的列和外键了。我发现有趣的是框架似乎记得哪一个是哪个,所以我想我会请专家解释。它可能变得有用 - 你不知道你是否不问! –

+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]] 
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,则表示您正在查找1对1关系。如果酒吧有一个foo_id,那么它会是一对多的。

它需要完成Foo has_one酒吧关系。