【问题标题】:ActiveRecord query: where a field is not trueActiveRecord 查询:字段不为真
【发布时间】:2012-07-17 13:34:34
【问题描述】:

我想查找字段不正确的所有记录。用于此的 AR 语法是:

Dog.where(:stray => [false, nil])

有没有更简洁的查询“不真实”的方法?不得不在任何地方迎合这种 mysql 的细微差别真的很糟糕。

【问题讨论】:

  • 我不会说那是 Arel,你只是在使用 AR(而 AR 又会使用 Arel 或其他)。
  • 谢谢 :) 我已经更新了问题

标签: ruby-on-rails ruby activerecord arel


【解决方案1】:

命名范围怎么样?

scope :not_stray, where("stray IS NULL OR stray = false")

然后使用:

Dog.not_stray

【讨论】:

  • 这是处理它的惯用方式,但我也推荐@Frost 提到的默认值。
  • 当然。我更喜欢将这类东西保留在业务逻辑层而不是数据库中。因此,他可以添加一个验证,确认该杂散属性存在真值或假值。
【解决方案2】:

我觉得你可以写Dog.where(Dog.arel_table[:stray].not_eq(true))

附带说明一下,我建议您为数据库中的stray 列设置一个默认值,或者至少需要一个值。这样你就不必做这个解决方法了。

【讨论】:

  • 虽然语法特别漂亮,但我绝对同意的是数据库应该有默认值。这完全避免了任何冗长的语法。谢谢!
  • 这会为我生成以下 SQL(通过 to_sql):SELECT "dogs".* FROM "dogs" WHERE ("dogs"."stray" != 't')WHERE stray = false OR stray IS NULL 不同
猜你喜欢
  • 2013-05-30
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多