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

问题描述 投票:0回答:4

所以,我有一个有两个模型的应用程序。 Foo 有_一个 Bar,Bar 属于 Foo。

现在,要创建一个 Foo,您必须创建一个属于它的 Bar,但它看起来像是从裂缝中溜走的东西,因为在我的生产应用程序中,我现在似乎有一个 Foo 是以某种方式在没有 Bar 的情况下创建的,并且它会导致 500 错误。

现在,问题来了:

我可以搜索:

Bar.where(:foo=>nil)
就好了。但孤儿条不是问题,这并没有告诉我我需要什么。

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

当我使用

Foo.find(#).bar
时,我会因为一条虚假记录而得到零,但我有很多记录。

那么,谁能告诉我如何构建一个查询来返回缺少 Bar 的 Foo ?

谢谢!!

sql ruby-on-rails ruby-on-rails-3 find associations
4个回答
8
投票

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

从 Foo 中选择 *,其中 id 不在(从 Bar 中选择 foo_id)


2
投票

另一种方法(不使用 SQL)是执行以下操作:

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

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

在此方法中,您不依赖于特定的表信息。如果在未来 Foo -> Bar 关联中foreign_key列发生变化,这个方法将继续工作。


2
投票

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

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

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


0
投票

这将执行一个查询。而且,日志文件更容易。

Foo.where.not(id: Bar.select(:foo_id))
© www.soinside.com 2019 - 2024. All rights reserved.