首页
学习
活动
专区
工具
TVP
发布
社区首页 >问答首页 >Rails where条件使用NOT NIL

Rails where条件使用NOT NIL
EN

Stack Overflow用户
提问于 2010-11-23 10:56:02
回答 4查看 256.9K关注 0票数 378

使用rails 3样式时,我该如何编写与以下内容相反的代码:

代码语言:javascript
复制
Foo.includes(:bar).where(:bars=>{:id=>nil})

我想找出id不为零的地方。我试过了:

代码语言:javascript
复制
Foo.includes(:bar).where(:bars=>{:id=>!nil}).to_sql

但这会得到回报:

代码语言:javascript
复制
=> "SELECT     \"foos\".* FROM       \"foos\"  WHERE  (\"bars\".\"id\" = 1)"

这绝对不是我需要的,而且看起来像是ARel中的一个bug。

EN

回答 4

Stack Overflow用户

回答已采纳

发布于 2010-11-23 11:51:49

使用Rails 3实现这一点的规范方法是:

代码语言:javascript
复制
Foo.includes(:bar).where("bars.id IS NOT NULL")

ActiveRecord 4.0及更高版本添加了where.not,因此您可以执行以下操作:

代码语言:javascript
复制
Foo.includes(:bar).where.not('bars.id' => nil)
Foo.includes(:bar).where.not(bars: { id: nil })

在处理表之间的作用域时,我更喜欢利用merge,这样就可以更容易地使用现有作用域。

代码语言:javascript
复制
Foo.includes(:bar).merge(Bar.where.not(id: nil))

此外,由于includes并不总是选择连接策略,因此在这里也应该使用references,否则可能会得到无效的SQL。

代码语言:javascript
复制
Foo.includes(:bar)
   .references(:bar)
   .merge(Bar.where.not(id: nil))
票数 537
EN

Stack Overflow用户

发布于 2010-11-23 11:53:14

这不是ARel中的bug,而是您的逻辑中的bug。

您在这里需要的是:

代码语言:javascript
复制
Foo.includes(:bar).where(Bar.arel_table[:id].not_eq(nil))
票数 251
EN

Stack Overflow用户

发布于 2016-11-11 20:03:02

我不确定这是否有帮助,但这对我在Rails4中是有效的

代码语言:javascript
复制
Foo.where.not(bar: nil)
票数 33
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/4252349

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档