使用rails 3样式时,我该如何编写与以下内容相反的代码:
Foo.includes(:bar).where(:bars=>{:id=>nil})
我想找出id不为零的地方。我试过了:
Foo.includes(:bar).where(:bars=>{:id=>!nil}).to_sql
但这会得到回报:
=> "SELECT \"foos\".* FROM \"foos\" WHERE (\"bars\".\"id\" = 1)"
这绝对不是我需要的,而且看起来像是ARel中的一个bug。
发布于 2010-11-23 11:51:49
使用Rails 3实现这一点的规范方法是:
Foo.includes(:bar).where("bars.id IS NOT NULL")
ActiveRecord 4.0及更高版本添加了where.not
,因此您可以执行以下操作:
Foo.includes(:bar).where.not('bars.id' => nil)
Foo.includes(:bar).where.not(bars: { id: nil })
在处理表之间的作用域时,我更喜欢利用merge
,这样就可以更容易地使用现有作用域。
Foo.includes(:bar).merge(Bar.where.not(id: nil))
此外,由于includes
并不总是选择连接策略,因此在这里也应该使用references
,否则可能会得到无效的SQL。
Foo.includes(:bar)
.references(:bar)
.merge(Bar.where.not(id: nil))
发布于 2010-11-23 11:53:14
这不是ARel中的bug,而是您的逻辑中的bug。
您在这里需要的是:
Foo.includes(:bar).where(Bar.arel_table[:id].not_eq(nil))
发布于 2016-11-11 20:03:02
我不确定这是否有帮助,但这对我在Rails4中是有效的
Foo.where.not(bar: nil)
https://stackoverflow.com/questions/4252349
复制相似问题