【问题标题】:booleans in rails with sqlite带有sqlite的rails中的布尔值
【发布时间】:2010-10-24 02:21:32
【问题描述】:

我还是个菜鸟,但我还是遇到了一些看起来有点奇怪的东西。因此,我在数据库中的模型中添加了一个布尔字段

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

但是,sqlite3 数据库中的值似乎是't''f'。这很好,但如果值为'f',我仍然希望user.admin? 返回false。从以下控制台会话中可以看出,情况并非如此:

>> user = User.first
=> #<User id: 2, login: "matt", name: "", email: "google.ninja@no-spam.com", 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: "google.ninja@no-spam.com", 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 的一些奇怪问题,还是我没有得到什么?

【问题讨论】:

  • 我不知道确切的答案,但我认为这可能与 Ruby/Rails 有关,而不是 SQLite 本身。 SQLite 实际上没有布尔数据类型(参见sqlite.org/datatype3.html),因此包装器有责任以某种方式对其进行编码。通常会使用 1 或 0,但 Rails 可能会做一些奇怪的事情。另外,请记住 SQLite 是弱类型的,因此您可以将 int 放入您的 varchar 列等,如果您不小心,这可能会导致痛苦(相关讨论请参阅chriscraig.net/blog/sqlite-boolean-true-or-false)。

标签: ruby-on-rails ruby sqlite model boolean


【解决方案1】:

改用这个:

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

了解为什么here

【讨论】:

  • 是的,我认为这很奇怪。谢谢 :) +1 并标记为已回答
【解决方案2】:

问题可能与数据库迁移有关。我不认为 :bool 是要使用的正确数据类型名称。尝试 :boolean 代替,例如

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-10-24
    • 1970-01-01
    • 1970-01-01
    • 2012-05-30
    • 1970-01-01
    • 2011-11-11
    相关资源
    最近更新 更多