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?
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. –