Rails:包含日期时间查询的范围

Flo*_*ock 0 ruby-on-rails rails-activerecord

我正在尝试定义一个scope包含所有尚未过期的项目 - 或者根本没有过期日期的项目(nil).

这就是我所拥有的,但它不会返回我想要的东西:

scope :active, -> { where(["expires > ? OR expires = ?", Time.now, nil]) }
Run Code Online (Sandbox Code Playgroud)

我是Rails的新手,有没有明显的东西我缺少(或者可能是一个明显的语法错误)?

Jiř*_*šil 5

比较NULL值时需要使用特殊语法.试试这样:

scope :active, -> { where("expires > ? OR expires IS NULL", Time.zone.now) }
Run Code Online (Sandbox Code Playgroud)

我也改变Time.nowTime.zone.now使其使用你的应用程序配置的时区.

  • 问题在于 NULL 值被视为“未知值”。因此,将 NULL 与另一个 NULL 进行比较(这就是“=”运算符的作用)会产生另一个 NULL - NULL 不等于 NULL。 (2认同)