Rails范围与布尔值

时间:2012-07-03 06:31:03

标签: ruby-on-rails rails-activerecord

当你在带有活动记录的Rails中使用布尔值时,你问(例如)visible?,它会检查列是否为true。如果是falsenilvisible?将返回false

如何使用布尔值来询问?方法是否会返回false?我有这个:

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

但我想知道是否有更清洁的方式。有没有办法在没有明确说明nilfalse的情况下编写此范围?如果我们相反,我们可以写

scope :invisible, where(hide: true)

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

4 个答案:

答案 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的回答并没有真正回答手头的问题,但"什么是可见范围的最佳代码?" ,我肯定会回应他所说的布尔列应始终为truefalse

实际上,没有数据库甚至不允许声明为boolean的列不是truefalse,因为否则,它不是真正的布尔值。但这是一个单独的蠕虫病毒。 :-D