我有一个应用程序有两个模型。Foo拥有一个Bar,而Bar属于Foo。
现在,要创建一个Foo,你必须创建一个属于它的Bar,但在我的生产应用程序中似乎有一个没有Bar的Foo被创建了,这导致了500错误。
现在,问题来了:
我可以轻松地搜索:Bar.where(:foo => nil)
。但是孤儿bars不是问题,这并不能告诉我需要的信息。
我需要找到Bar为nil的那个Foo。但数据库将关系存储在Bars表中,即BarsTable中有foo_id,FoosTable中没有任何内容告诉我缺少一个bar。
当我使用Foo.find(#).bar
时,对于一个虚假记录,我得到的是nil,但我有很多记录。
因此,有人可以告诉我如何构建一个查询来返回丢失其Bar的一个Foo吗?
谢谢!
Foo.where("id NOT IN (SELECT foo_id FROM Bar)")
。 谢谢! - AndrewFoo.joins(:bar)
,这将导致 SQL 查询为SELECT \
foos`.* FROM `foos` INNER JOIN `bars` ON `bars`.`foo_id` = `foos`.`id`。你还可以进一步优化:
Foo.includes(:bar).joins(:bar)` 可能会为您节省几个后续对数据库的请求。 - Isaac Betesh