9

Active Record で Rails で boolean を使用していて、(たとえば) と尋ねるとvisible?、列が正しいかどうかをチェックしますtruefalseまたはの場合はnilvisible?を返しfalseます。

?メソッドが false を返すかどうかを確認するブール値の範囲を指定するにはどうすればよいですか? 私はこれを持っています:

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

しかし、よりクリーンな方法があるかどうか疑問に思っています。nilと の両方を明示的に言わずにこのスコープを記述する方法はありfalseますか? 反対の場合は、次のように書くことができます

scope :invisible, where(hide: true)

よりきれいに見えます。可視スコープに最適なコードは何ですか?

4

4 に答える 4

15

私は一緒に行きます:

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

SQL ではNULL、 は欠損値または不明な値を表すため、厳密に言えば、 を持つレコードhide = NULLは可視でも不可視でもありません。

于 2012-07-03T08:08:59.887 に答える
7

列にデフォルト値を使用します。これには 2 つの理由があります。DB に可能な値が 2 つしかないため、コードが簡単になります。また、ブール値は true または false のいずれかであり、nil ではなく、maybe ではなく、foobar ではありません。真と偽。「ただし、DBを厳密にfalse/trueにする必要は避けたい」というのは、ブール列の議論の余地のある議論です。

2つ以上の状態が必要な場合は、状態マシンまたは同様のものを使用してください。これは、ブール列/状態ではなくなります。

于 2012-07-03T07:33:50.050 に答える
3

ステファンの答えとほぼ同じですが、少し単純化されています:

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) }

タネルの答えは、「可視スコープに最適なコードは何ですか?」という目前の質問に実際には答えていませんが。true、ブール列は常にまたはのいずれかでなければならないという彼の言ったことを間違いなく繰り返しfalseます

実際、データベースはorboolean以外のものとして宣言された列を許可するべきではありません。しかし、それはワームの別の缶です。:-Dtruefalse

于 2018-02-08T19:22:15.347 に答える