Rails:找到没有的记录的“has_one”记录

时间:2011-04-08 13:59:19

标签: sql ruby-on-rails ruby-on-rails-3 find associations

所以,我有一个有两个型号的应用程序。 Foo has_one Bar,Bar belongs_to Foo。

现在,要创建一个Foo,你必须要创建一个属于它的Bar,但它看起来像是一些漏洞,因为在我的生产应用程序中,我现在似乎有一个Foo以某种方式在没有Bar的情况下创建,它会导致500错误。

现在,问题在于:

我可以搜索:Bar.where(:foo=>nil)就好了。但孤儿棒不是问题,这并不能告诉我我需要什么。

我需要找到Bar为零的一个Foo。但是数据库将关系存储在Bars表中,即BarsTable中包含foo_id,FoosTable中没有任何内容告诉我它缺少一个条。

当我使用Foo.find(#).bar时,我会为一张虚假记录获取nil,但我有很多记录。

那么,任何人都可以告诉我如何构建一个返回缺少它的Bar的一个Foo的查询吗?

谢谢!

3 个答案:

答案 0 :(得分:7)

我不确定Ruby代码是什么,但我认为SQL应该是这样的:

SELECT * FROM Foo WHERE id NOT IN(SELECT foo_id FROM Bar)

答案 1 :(得分:2)

另一种方式(不使用SQL)将是这样的:

Foo.all.select {| f | !f.bar}

这将返回一个没有相关Bar对象的Foo对象数组。

在此方法中,您不依赖于特定的表信息。如果foreign_key列将来要改变Foo - >律师协会,这种方法将继续发挥作用。

答案 2 :(得分:0)

对于将来的用户访问者,另一种实现此目的的方法是-

Foo.all.where.not(id: Bar.pluck(:belongs_to_id))

这会执行两个查询,一个查询是拔毛,另一个查询是Foo.where.not(id:plucked_ids)。