当你在带有活动记录的Rails中使用布尔值时,你问(例如)visible?
,它会检查列是否为true
。如果是false
或nil
,visible?
将返回false
。
如何使用布尔值来询问?
方法是否会返回false?我有这个:
scope :visible, where(hide: [nil, false])
但我想知道是否有更清洁的方式。有没有办法在没有明确说明nil
和false
的情况下编写此范围?如果我们相反,我们可以写
scope :invisible, where(hide: true)
看起来更干净。什么是可见范围的最佳代码?
答案 0 :(得分:13)
我会选择:
scope :visible, -> { where(hide: false) }
scope :invisible, -> { where(hide: true) }
在SQL NULL
中表示缺失或未知的值,因此严格来说hide = NULL
的记录既不可见也不可见。
答案 1 :(得分:6)
在列上使用默认值。这有两个原因:数据库中只有两个可能的值,使代码更容易。布尔值要么是真的要么是假的,不是零,也许不是,而不是foobar。真假。 “我宁愿避免让DB严格错误/为真,”对于布尔列来说,这是一个模糊的论据。
如果您需要超过2个状态,请使用状态机或类似的东西 - 然后它不再是布尔列/状态。
答案 2 :(得分:3)
与Stefan的答案几乎相同,有点简化:
scope :visible, where(hide: false)
scope :invisible, where(:hide)
它适用于PostgreSQL,但我不确定它是否适用于其他数据库。
答案 3 :(得分:1)
从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的回答并没有真正回答手头的问题,但"什么是可见范围的最佳代码?" ,我肯定会回应他所说的布尔列应始终为true
或false
。
实际上,没有数据库甚至不允许声明为boolean
的列不是true
或false
,因为否则,它不是真正的布尔值。但这是一个单独的蠕虫病毒。 :-D