2009-05-06 6 views
9

Je suis un peu un noob encore avec des rails, mais je cours à travers quelque chose qui semble un peu étrange. J'ai ajouté un champ booléen à un modèle dans la base de données thuslybooléens dans les rails avec sqlite

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

Cependant, la valeur de la base de données sqlite3 semble être soit 't' ou 'f'. C'est bien, mais je m'attendrais encore user.admin? à retourner false si la valeur est 'f'. Comme vous pouvez le voir sur la session de console suivante, ce n'est pas le cas:

>> 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 

Est-ce que quelques-uns problème bizarre avec SQLite, ou suis-je tout simplement pas obtenir quelque chose?

+0

Je ne connais pas la réponse exacte, mais je pense que cela a probablement à voir avec Ruby/Rails, pas SQLite en soi. SQLite n'a pas de type de données booléen (voir http://www.sqlite.org/datatype3.html), donc c'est la responsabilité de l'encapsuleur de l'encoder d'une manière ou d'une autre. Typiquement, 1 ou 0 serait utilisé, mais Rails peut faire quelque chose de bizarre. Aussi, rappelez-vous que SQLite est faiblement typé afin que vous puissiez mettre des ints dans vos colonnes varchar, etc. et cela peut causer de la douleur (voir http://chriscraig.net/blog/sqlite-boolean-true-or-false/ pour une discussion pertinente) si vous ne faites pas attention. –

Répondre

13

Utilisez ce lieu:

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

Lire pourquoi here.

+0

ouais, j'ai pensé que c'était quelque chose d'étrange comme ça. Merci :) +1 et marqué comme répondu –

1

Le problème peut provenir de la migration de la base de données. Je ne pense pas que: bool est le bon nom de type de données à utiliser. Essayez: booléen à la place, par ex.

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