where与rails中的同一列具有或条件

t1rydlwq  于 2021-07-26  发布在  Java
关注(0)|答案(3)|浏览(324)

我正在检索所有 expired_at 为零和 expired_at 大于当前时间。
我试过这个:

PriceRule.where("expired_at > ? OR expired_at = ?", DateTime.now, nil)

但那只是把唱片还给我 expired_at 大于 DateTime.now . 为什么 nil 被忽视?

00jrzges

00jrzges1#

您当前的查询检查 expired_at 等于null(通过 = NULL )这将无法评估为真。相反,您希望使用 IS NULL .
因此,可以将查询调整为以下内容:

PriceRule.where("expired_at > ? OR expired_at IS NULL", DateTime.now)

或者,如果你想保持你原来的论点结构,你可以通过 nil 如前所述:

PriceRule.where("expired_at > ? OR expired_at IS ?", DateTime.now, nil)
kmbjn2e3

kmbjn2e32#

您还可以利用rails or 在这里,这将照顾到 IS NULL 而不是 = NULL . 我也建议使用 Time.current 相反,它对时区有更好的支持。

PriceRule
  .where('expired_at > ?', Time.current)
  .or(PriceRule.where(expired_at: nil))
uplii1fm

uplii1fm3#

我想你也可以使用以下语法

PriceRule
.where(expired_at: DateTime.now..)
.or(PriceRule.where(expired_at: nil))

相关问题