2009-05-06 11 views
9

Sono un po 'un noob ancora con le guide, ma sto correndo su qualcosa che sembra un po' strano. Ho aggiunto un campo booleano a un modello nel database di questa convenzionebooleans in rails con sqlite

t.column :admin, :bool, :default => false, :null => false 

Tuttavia, il valore nel database sqlite3 sembra essere o 't' o 'f'. Va bene, ma mi aspetto comunque che user.admin? restituisca false se il valore è 'f'. Come si può vedere dalla seguente sessione della console, che non è il caso:

>> user = User.first 
=> #<User id: 2, login: "matt", name: "", email: "[email protected]", crypt 
ed_password: "c6740f820b4cbf6e3d88188719f23cd3053a54f0", salt: "5629f5ee09f51543 
a7d64dd903b8d9e53aa43a24", created_at: "2009-04-26 23:08:05", updated_at: "2009- 
04-26 23:10:38", remember_token: nil, remember_token_expires_at: nil, admin: "t" 
> 
>> user.admin? 
=> true 
>> user.admin = false 
=> false 
>> user.save 
=> true 
>> user = User.first 
=> #<User id: 2, login: "matt", name: "", email: "[email protected]", crypt 
ed_password: "c6740f820b4cbf6e3d88188719f23cd3053a54f0", salt: "5629f5ee09f51543 
a7d64dd903b8d9e53aa43a24", created_at: "2009-04-26 23:08:05", updated_at: "2009- 
05-06 03:32:23", remember_token: nil, remember_token_expires_at: nil, admin: "f" 
> 
>> user.admin? 
=> true 

E 'solo qualche problema strano con SQLite, o non sono io solo ottenere qualcosa?

+0

Non conosco la risposta esatta, ma penso che probabilmente abbia a che fare con Ruby/Rails, non con SQLite in sé. SQLite in realtà non ha un tipo di dati booleani (vedi http://www.sqlite.org/datatype3.html), quindi è responsabilità del wrapper di codificarlo in qualche modo. In genere, verrebbe utilizzato 1 o 0, ma Rails potrebbe fare qualcosa di strano. Inoltre, ricorda che SQLite è debolmente digitato in modo da poter inserire le tue colonne varchar, ecc. E ciò può causare dolore (vedi http://chriscraig.net/blog/sqlite-boolean-true-or-false/ per la discussione pertinente) se non stai attento. –

risposta

13

Utilizzare questo invece:

t.column :admin, :boolean, :default => false, :null => false 

Leggi perché here.

+0

sì, ho pensato che fosse qualcosa di strano. Grazie :) +1 e contrassegnato come risposta –

1

Il problema potrebbe riguardare la migrazione del database. Non penso che: bool è il nome giusto per il tipo di dati da utilizzare. Prova: booleano invece, ad es.

t.column :admin, :boolean, :default => false, :null => false