2009-05-06 171 views
9

我有点仍然与铁轨noob,但我碰到的东西似乎有点奇怪。我在数据库中增加了一个布尔字段到模型正是如此与sqlite的布尔的布尔值

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: "[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

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

回答

13

使用这个代替:

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

阅读为什么here

+0

是的,我觉得这是奇怪的。谢谢:) +1并标记为已回答 – 2009-05-06 14:27:24

1

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

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