2010-08-20 10 views
24

Ho un campo DB che è un tipo intero ei valori sono sempre 0 o 1. Come faccio a prendere il valore booleano equivalente in ruby? in modo tale che quando faccio la seguente casella di controllo è impostata in modo appropriato:intero ruby ​​in booleano

<%= check_box_tag 'resend', @system_config.resend %> 

risposta

44

Si potrebbe utilizzare il metodo zero?. Restituisce vero se 0. Se hai bisogno di retrocedere, puoi facilmente negarlo a [email protected]_config.resend.zero?. Oppure puoi estendere la classe Fixnum, aggiungendo un metodo to_b?, poiché tutto è aperto ed estensibile nei linguaggi dinamici.

class Integer 
    def to_b? 
    !self.zero? 
    end 
end 

alt text

Rubino API: http://ruby-doc.org/core/classes/Fixnum.html#M001050

+0

Grazie Jarret. Parte della mia soluzione era anche utilizzare l'helper check_box_tag correttamente in questo modo: <% = check_box_tag 'resend', @ system_config.resend, @ system_config.resend%> – Rafael

+1

Nota che c'è anche ['diverso da zero?'] (Http: //ruby-doc.org/core-1.9.3/Numeric.html#method-i-nonzero-3F) che può leggere meglio di '! zero?'. –

+6

Hai intenzionalmente fatto il tuo prompt dei colori BSoD? – NullVoxPopuli

9

1 è il vostro unico valore di verità qui. Quindi puoi ottenere il valore di verità booleana con number == 1.

+0

Forse questo potrebbe essere formulato in modo più chiaro Ho quasi pensato che volevi dire che si trattava di rubino standard. -standard-compatibile soluzione, che capita di adattarsi anche con la domanda reale. –

+0

@Simon B .: non sono sicuro di ciò che riguarda la mia risposta se ems "non standard" per te. Entrambi i metodi '==' e 'zero?' Sono Ruby standard. Ma succede che 'number == 1' si legge più chiaramente di'! Number.zero? 'IMO. – Chuck

+0

In ruby, sia 0 che 1 sono "veritieri", quindi in realtà non c'è alcuna possibilità di dare una risposta qui sia "standard" che di rispondere alla domanda. Scusate. Forse è meglio che provi a inserire questo nella domanda di testo o titolo. Chiunque venga qui in cerca di "casting fedele al rubino" da Fixnum a Boolean si confonderà comunque in entrambi i casi. Inoltre, secondo http://drawingablank.me/blog/ruby-boolean-typecasting.html sembra !! è l'unica opzione fedele al rubino. Quale non è un'opzione nella domanda di cui sopra. –

2

Ho avuto lo stesso problema e trattati in questo modo:

def to_boolean(var) 
case var 
     when true,'true',1,'1' 
     return true 
     when false, 'false',0,'0' 
     return false 
end 
end 

Questo funziona con forme, i database e le persone che non conoscono rubino. L'ho trovato utile specialmente con Rails, poiché i parametri sono spesso passati/interpretati come stringhe e non voglio preoccuparmene.

+2

L'indentazione qui è non standard. La forma più semplice sarebbe def to_boolean (valore) ['true', 1, '1', vero] .include? (Valore) fine –

Problemi correlati