2009-05-06 10 views
9

Soy un poco novato con rieles, pero estoy corriendo por algo que parece un poco extraño. He añadido un campo booleano a un modelo en la base de datos thuslybooleanos en rieles con sqlite

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

Sin embargo, el valor en la base de datos sqlite3 parece ser ya sea 't' o 'f'. Eso está bien, pero aún esperaría que user.admin? devuelva falso si el valor es 'f'. Como se puede ver en la siguiente sesión de la consola, que no es el 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 

Se trata sólo de una cierta edición extraña con SQLite, o estoy simplemente no conseguir algo?

+0

No sé la respuesta exacta, pero creo que probablemente tiene que ver con Ruby/Rails, no SQLite per se. SQLite en realidad no tiene un tipo de datos booleano (consulte http://www.sqlite.org/datatype3.html), por lo que es responsabilidad del responsable del contenido codificarlo de alguna manera. Normalmente, se usaría 1 o 0, pero Rails podría estar haciendo algo extraño. Además, recuerde que SQLite está débilmente tipado, por lo que puede colocar entradas en sus columnas varchar, etc. y esto puede causar dolor (consulte http://chriscraig.net/blog/sqlite-boolean-true-or-false/ para una discusión relevante).) si no tienes cuidado. –

Respuesta

13

Use este lugar:

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

leer por qué here.

+0

sí, pensé que era algo extraño como eso. Gracias :) +1 y marcado como respondido –

1

El problema puede ser con la migración de la base de datos. No creo que: bool es el nombre de tipo de datos correcto para usar. Pruebe: booleano en su lugar, p.

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