Область действия Rails с логическим значением

Когда вы используете логическое значение в Rails с Active Record и спрашиваете (скажем) visible?, оно проверяет столбец на предмет того, является ли он true или нет. Если это false или nil, visible? вернет false.

Как вы определяете логическое значение, чтобы спросить, вернет ли метод ? значение false? У меня есть это:

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

но мне интересно, есть ли более чистый способ. Есть ли способ написать эту область без явного указания nil и false? Если бы мы стремились к обратному, мы могли бы просто написать

scope :invisible, where(hide: true)

что кажется чище. Какой код лучше всего подходит для видимой области?


person Peter    schedule 03.07.2012    source источник
comment
Почему бы не дать hide значение по умолчанию в БД, тогда область видимости будет выглядеть намного чище: scope :visible, where(hide: false)   -  person Wukerplank    schedule 03.07.2012
comment
это то, к чему я стремлюсь - я бы предпочел не получать БД строго ложно/истинно.   -  person Peter    schedule 03.07.2012


Ответы (4)


Используйте значение по умолчанию для столбца. Это хорошо по двум причинам: у вас есть только два возможных значения в вашей БД, что упрощает ваш код. И логические значения либо истинны, либо ложны, а не nil, не возможно, не foobar. Правда и ложь. «Я бы предпочел избежать необходимости получать БД строго ложно/истинно» - спорный аргумент для логического столбца.

Если вам нужно более 2 состояний, используйте конечный автомат или что-то подобное - тогда это больше не логический столбец/состояние.

person Tanel Suurhans    schedule 03.07.2012

Я бы пошел с:

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

В SQL NULL представляет отсутствующее или неизвестное значение, поэтому, строго говоря, записи с hide = NULL не видны и не невидимы.

person Stefan    schedule 03.07.2012

Почти так же, как ответ Стефана, немного упрощенный:

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

Он работает для PostgreSQL, но я не уверен, что он будет работать для других баз данных.

person denis.peplin    schedule 03.12.2012
comment
В Rails 4: область: видимая, -> {где (скрыть: ложь)} - person benoitr; 29.12.2015

Начиная с 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.

На самом деле ни одна база данных не должна позволять столбцу, объявленному как boolean, быть чем-то другим, кроме true или false, потому что в противном случае он не будет по-настоящему логическим. Но это отдельная банка червей. :-D

person jeffdill2    schedule 08.02.2018