9

当您在带有 Active Record 的 Rails 中使用布尔值并询问 (say)visible?时,它会检查该列是否true存在。如果是falsenilvisible?将返回false

您如何确定布尔值的范围以询问该?方法是否会返回 false?我有这个:

scope :visible, where(hide: [nil, false])

但我想知道是否有更清洁的方法。有没有一种方法可以在不明确同时说明niland的情况下编写此范围false?如果我们在相反的情况下,我们可以写

scope :invisible, where(hide: true)

这看起来更干净。可见范围的最佳代码是什么?

4

4 回答 4

15

我会去:

scope :visible, -> { where(hide: false) }
scope :invisible, -> { where(hide: true) }

在 SQLNULL中表示缺失或未知的值,因此严格来说,记录hide = NULL既不可见也不不可见。

于 2012-07-03T08:08:59.887 回答
7

在列上使用默认值。这有两个好处:您的数据库中只有两个可能的值,使您的代码更容易。布尔值不是真就是假,不是 nil,不是可能,不是 foobar。真假。“我宁愿避免让数据库严格地为假/真”是布尔列的一个没有实际意义的论点。

如果您需要超过 2 个状态,请使用状态机或类似的东西 - 那么它不再是布尔列/状态。

于 2012-07-03T07:33:50.050 回答
3

与 Stefan 的答案几乎相同,有点简化:

scope :visible, where(hide: false)
scope :invisible, where(:hide)

它适用于 PostgreSQL,但我不确定它是否适用于其他数据库。

于 2012-12-03T05:50:08.113 回答
2

从 Rails 4 开始,您可以这样做:

# This will give you any hidden records
scope :invisible, -> { where(hide: true) }

# And this will give you any records that aren't hidden – whether nil *or* false
scope :visible, -> { where.not(hide: true) }

尽管 Tanel 的回答实际上并没有回答手头的问题,即“什么是可见范围的最佳代码?” ,我肯定会附和他所说的布尔列应该始终是trueor false

实际上,任何数据库都不应允许将列声明为orboolean以外的任何内容,因为否则,它不是真正的boolean。但这是一个单独的蠕虫罐头。:-Dtruefalse

于 2018-02-08T19:22:15.347 回答