2009-05-06 13 views
9

まだレールが付いているのですが、ちょっと変わったようなものがあります。私はしかし、sqlite3のデータベース内の値が't''f'のいずれかであるように思わthuslysqliteのレールでブール値

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

データベース内のモデルにブール型フィールドを追加しました。これは問題ありませんが、'f'の場合は、user.admin?がfalseを返すと予想されます。次のコンソールセッションからもわかるように、そうではありません。

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

これはsqliteのとちょうどいくつかの奇妙な問題である、または私はちょうど何かを得ていないのですか?

+0

正確な答えはわかりませんが、おそらくSQLite自体ではなく、Ruby/Railsと関係していると思います。 SQLiteは実際にはブール型のデータ型を持っていません(http://www.sqlite.org/datatype3.htmlを参照してください)。それで何とかエンコードするのはラッパーの責任です。通常、1または0が使用されますが、Railsは何か不思議なことをしている可能性があります。また、SQLiteは弱く型付けされているので、intをvarcharカラムなどに入れることができます。これは痛みを引き起こす可能性があります(http://chriscraig.net/blog/sqlite-boolean-true-or-false/を参照してください)。あなたが慎重でないならば)。 –

答えて

13

使用この代わりに:

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

here理由をお読みください。

+0

ええ、私はそれがそんなに奇妙なものだと考えました。ありがとう:) +1と答えとしてマーク –

1

問題は、データベースの移行に問題がある可能性があります。私はそれを考えていません:boolは、使用する正しいデータ型名です。試してみてください。

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