当您使用带有活动记录的Rails中的布尔值,并询问(例如) visible?
时,它将检查该列是否为true
。如果是false
或nil
,visible?
将返回false
。
如何确定布尔值的范围以询问?
方法是否返回false?我有这个:
scope :visible, where(hide: [nil, false])
但我想知道是否有更清洁的方法。有没有一种方法可以编写这个作用域而不显式地同时声明nil
和false
?如果我们想要的是相反的话,我们可以直接写
scope :invisible, where(hide: true)
看上去更干净。可见作用域的最佳代码是什么?
发布于 2012-07-02 23:33:50
在列上使用默认值。这有两个好的原因:您的DB中只有两个可能的值,这使得代码更容易编写。布尔人要么是真的,要么是假的,不是零,也不是也许,不是足底。对和错。对于布尔列,“我宁愿避免获得严格的false/true”这是一个模拟参数。
如果您需要两个以上的状态,请使用状态机或类似的东西--那么它不再是布尔列/状态了。
发布于 2012-07-03 00:08:59
我会选择:
scope :visible, -> { where(hide: false) }
scope :invisible, -> { where(hide: true) }
在SQL中,NULL
表示缺少或未知的值,因此严格地说,使用hide = NULL
的记录既不可见也不可见。
发布于 2012-12-02 21:50:08
几乎和斯特凡的回答一样,有点简化:
scope :visible, where(hide: false)
scope :invisible, where(:hide)
它适用于PostgreSQL,但我不确定它是否适用于其他数据库。
https://stackoverflow.com/questions/11305587
复制相似问题