ruby-on-rails Rails:查找没有“has_one”的记录

p4rjhz4m  于 2023-10-21  发布在  Ruby
关注(0)|答案(4)|浏览(115)

所以,我有一个有两个模型的应用程序。Foo有一个Bar,Bar属于Foo。
现在,要创建一个Foo,你必须创建一个属于它的Bar,但它看起来像是从裂缝中溜走了,因为在我的生产应用程序中,我现在似乎有一个Foo,不知何故,它没有Bar,它会导致500错误。
现在问题来了
我可以搜索:Bar.where(:foo=>nil)很好。但孤儿院不是问题,这也不能说明我需要什么。
我需要找到一个巴为零的福。但是数据库将关系存储在Bars表中,即BarsTable中有foo_id,FoosTable中没有任何东西告诉我它缺少一个酒吧。
当我使用Foo.find(#).bar时,我会为一个假记录得到nil,但我有很多记录。
那么,谁能告诉我如何构造一个查询,返回一个缺少Bar的Foo?
谢谢你!

gpnt7bae

gpnt7bae1#

我不确定Ruby代码会是什么,但我认为SQL应该是这样的:
SELECT * FROM Foo WHERE ID NOT IN(SELECT foo_id FROM Bar)

h79rfbju

h79rfbju2#

另一种方法(不使用SQL)是这样做:
Foo.all.selectwww.example.com| F|!f.bar }
这将返回一个没有相关Bar对象的Foo对象数组。
在此方法中,您不依赖于特定的表信息。如果foreign_key列在未来的Foo -> Bar关联中发生更改,此方法将继续工作。

h79rfbju

h79rfbju3#

对于未来的用户访问者,另一种方法来实现这一点是通过做-

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

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

jk9hmnmh

jk9hmnmh4#

使用left_outer_join。

Foo.left_outer_joins(:bar).where(bars: { id: nil })

Rails为这种情况添加了一个很好的方便方法

Foo.where.missing(:bar)

相关问题