轨道:查找没有记录的"has_one"记录



我有一个有两个模型的应用程序。Foo has_one Bar, Bar belongs_to Foo.

现在,要创建一个Foo,你必须要创建一个Bar来属于它,但它看起来像是从裂缝中滑过的东西,因为在我的生产应用程序中,我现在似乎有一个Foo,不知怎么地没有创建Bar,它会导致500错误。

现在,问题来了:

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

我需要找到一个Foo,其中Bar为nil。但是数据库将关系存储在Bars表中,例如,BarsTable中有foo_id, FoosTable中没有任何东西告诉我它缺少一个bar。

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

所以,谁能告诉我如何构建一个查询,将返回一个Foo是缺少它的酒吧?

谢谢! !

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

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

另一种方法(不使用SQL)是这样做:

Foo.all。选择{|f| !f。酒吧}

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

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

对于未来的用户访问者,另一种完成此操作的方法是-

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

执行两个查询,一个用于拔,一个用于Foo.where。(id: plucked_ids)。

相关内容

  • 没有找到相关文章

最新更新