【问题标题】:activerecord search conditions - looking for null or falseactiverecord 搜索条件 - 寻找 null 或 false
【发布时间】:2009-09-26 15:36:23
【问题描述】:

在活动记录中进行搜索时,我正在寻找未将归档位设置为 true 的记录。

一些存档位为空(未存档),其他已存档位设置为 false。

显然,

Project.all(:conditions => {:archived => false})

错过了具有空值存档位的项目。如何在活动记录中选择所有未归档的项目?

【问题讨论】:

    标签: ruby-on-rails activerecord


    【解决方案1】:

    Rails 4(可能更早)支持:

    Project.where(archived: [false, nil])
    

    ...非常简洁。

    【讨论】:

    • 在 Rails 3.2.14 中工作
    • 也发现了这个工作(有点离题,但另一种使用 null 的方式:Project.where(archived: valid_values + [nil]) 例如... Project.where(linkage: account.project_codes .map(&:id) + [nil])
    【解决方案2】:

    试试这个(在 Rails 2 中):

    Project.all(:conditions => ['archived IS NULL OR archived = ?', false])
    

    这是旧版本 Rails 的限制,如下所述:https://rails.lighthouseapp.com/projects/8994/tickets/1181-ar-find-producing-null-when-it-should-be-is-null

    【讨论】:

    • Ron - 当我按照您的建议执行操作时,我从 SQLite 收到以下错误消息。 SQLite3::SQLException: no such column: FALSE: SELECT * FROM "review_phases" WHERE (closed IS NULL OR closed = FALSE) LIMIT 20 OFFSET 0 难道 SQLite 只是以不同的方式处理布尔值导致这不起作用?
    【解决方案3】:

    执行此操作的正确的与数据库无关的方法是:

    Project.where("archived IS NULL OR archived = ?", false)
    

    【讨论】:

    • 谢谢!适用于 SQLite 和 Postgres。请注意,如果您认为这不起作用,请仔细检查您的数据库中的值 是否 为 false 而不是 Null。会为我节省一些困惑。
    【解决方案4】:

    @metasoarous

    试试:

    Project.all(:conditions => "archived IS NULL OR archived = 'F'")
    

    【讨论】:

      【解决方案5】:

      如果您想与数据库无关,可以在 Rails 3 中执行此操作:

      Project.where("archived IS NULL OR archived = #{ActiveRecord::Base.connection.quoted_false}")
      

      【讨论】:

      • @SeanLazer 下面的回答适用于 Rails 3.0.9,看起来更干净。
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2012-10-24
      • 1970-01-01
      相关资源
      最近更新 更多