2012-07-03 20 views
7

Cuando usa un booleano en Rails con Active Record y pregunta (por ejemplo) visible?, comprueba si la columna es true o no. Si es false o nil, visible? devolverá false.Rails scope with boolean

¿Cómo delimita un booleano para preguntar si el método ? devolvería falso? Tengo esto:

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

pero me pregunto si hay una manera más limpia. ¿Hay alguna manera de escribir este alcance sin decir explícitamente nil y false? Si buscáramos lo contrario, podríamos simplemente escribir

scope :invisible, where(hide: true) 

que parece más limpio. ¿Cuál es el mejor código para el alcance visible?

+0

Por qué no darle a 'hide' un valor predeterminado en el DB, entonces el alcance se vería mucho más limpio:' scope: visible, where (hide: false) ' – Wukerplank

+0

eso es lo que voy a hacer - I ' Sin embargo, preferimos evitar tener que obtener el DB estrictamente falso/verdadero. – Peter

Respuesta

4

Utilice un valor predeterminado en la columna. Esto es bueno por dos razones: solo tiene dos valores posibles en su base de datos, lo que hace que su código sea más fácil. Y los booleanos son verdaderos o falsos, no son nulos, quizás no sean foobar. Verdadero y falso. "Prefiero evitar tener que obtener el DB estrictamente falso/verdadero sin embargo" es un argumento discutible para una columna booleana.

Si necesita más de 2 estados, use una máquina de estados o algo similar, entonces ya no es una columna/estado booleano.

12

me gustaría ir con:

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

En SQL NULL representa un valor perdido o desconocido por lo que estrictamente hablando con los registros hide = NULL son visibles ni invisibles.

3

casi la misma que la respuesta de Stefan, un poco simplificado:

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

Funciona para PostgreSQL, pero no estoy seguro de que va a trabajar para otras bases de datos.

+2

En Rails 4: ámbito: visible, -> {donde (ocultar: falso)} – benoitr

0

A partir de los carriles 4, se puede lograr esto, así:

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

Aunque la respuesta de Tanel en realidad no responde a la cuestión que nos ocupa, que es "¿Cuál es el mejor código de lo visible ¿alcance?", definitivamente me haría eco de lo que dijo que una columna booleana siempre debería ser true o false.

Realmente, ninguna base de datos, incluso debería permitir una columna declarada como boolean a ser otra cosa que true o false porque, de lo contrario, no es verdaderamente booleano. Pero eso es una lata de gusanos separada. :-D