对于 Rails4:
所以,你想要的是一个内部连接,所以你真的应该只使用连接谓词:
Foo.joins(:bar)
Select * from Foo Inner Join Bars ...
但是,作为记录,如果您想要一个“NOT NULL”条件,只需使用 not 谓词:
Foo.includes(:bar).where.not(bars: {id: nil})
Select * from Foo Left Outer Join Bars on .. WHERE bars.id IS NOT NULL
请注意,此语法报告了弃用(它谈论的是字符串 SQL 片段,但我猜散列条件在解析器中更改为字符串?),因此请务必将引用添加到末尾:
Foo.includes(:bar).where.not(bars: {id: nil}).references(:bar)
弃用警告:看起来您正在急切加载在字符串 SQL 片段中引用的表(以下之一:...)。例如:
Post.includes(:comments).where("comments.title = 'foo'")
目前,Active Record 识别字符串中的表,并知道将评论表加入查询,而不是在单独的查询中加载评论。然而,在不编写成熟的 SQL 解析器的情况下这样做是有内在缺陷的。由于我们不想编写 SQL 解析器,因此我们将删除此功能。从现在开始,当你从一个字符串中引用一个表时,你必须明确地告诉 Active Record:
Post.includes(:comments).where("comments.title = 'foo'").references(:comments)