まだレールが付いているのですが、ちょっと変わったようなものがあります。私はしかし、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のとちょうどいくつかの奇妙な問題である、または私はちょうど何かを得ていないのですか?
正確な答えはわかりませんが、おそらく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/を参照してください)。あなたが慎重でないならば)。 –