2012-07-03 12 views
7

Quando si utilizza un booleano in Rails con record attivo e si chiede (per esempio) visible?, si verifica se la colonna è true oppure no. Se è false o nil, visible? restituirà false.Scorrimento rotaie con booleano

Come si esegue il provisioning di un booleano per chiedere se il metodo ? restituirà false? Ho questo:

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

ma mi chiedo se c'è un modo più pulito. C'è un modo per scrivere questo ambito senza dire esplicitamente sia nil e false? Se cercassimo il contrario, potremmo semplicemente scrivere

scope :invisible, where(hide: true) 

che sembra più pulito. Qual è il miglior codice per lo scope visibile?

+0

Perché non dare 'nascondi' un valore predefinito nel DB, quindi l'ambito apparirebbe più pulito:' ambito: visibile, dove (nascondi: falso) ' – Wukerplank

+0

è quello che sto per - I ' d piuttosto evitare di dover ottenere il DB rigorosamente falso/vero però. – Peter

risposta

4

Utilizzare un valore predefinito sulla colonna. Questo è valido per due motivi: hai solo due possibili valori nel tuo DB, rendendo più semplice il tuo codice. E i booleani sono vere o false, non nulle, non forse, non fobie. Vero e falso. "Preferisco evitare di dover ottenere il DB rigorosamente falso/vero però" è un argomento moot per una colonna booleana.

Se sono necessari più di 2 stati, utilizzare una macchina a stati o qualcosa di simile - quindi non è più una colonna/stato booleano.

12

mi piacerebbe andare con:

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

In SQL NULL rappresenta un valore mancante o sconosciuto in modo rigorosamente record parlando con hide = NULL non sono né visibili né invisibili.

3

Quasi la stessa risposta di Stefan, un po 'semplificato:

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

Funziona per PostgreSQL, ma non sono sicuro che funzionerà per altri database.

+2

In Rails 4: scope: visible, -> {where (hide: false)} – benoitr

0

Come di Rails 4, è possibile eseguire questa in questo modo:

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

Anche se la risposta di Tanel in realtà non rispondere alla domanda a portata di mano, che è "Qual è il codice migliore per il visibile scopo?", farei sicuramente eco a ciò che ha detto che una colonna booleana dovrebbe sempre essere true o false.

Davvero, nessun database dovrebbe anche consentire una colonna dichiarata come boolean di essere qualcosa di diverso da true o false perché, in caso contrario, non è veramente booleano. Ma questa è una lattina separata di vermi. :-D

Problemi correlati