2010-12-06 43 views
0

哈希方式工作得很好:关于在Rails的查询方法条件3

drummers = Drummer.where(:gender => true) 

=> [#<Drummer id: 1, first_name: "Bernard", middle_name: nil, second_name: "Purdie", nick_name: "Pretty Purdie", gender: true, created_at: "2010-12-05 02:47:56", updated_at: "2010-12-05 02:50:42">] 

但在字符串的方式同样的事情:

drummers = Drummer.where("gender = true") 

我有以下错误: A ctiveRecord :: StatementInvalid: SQLite3 :: SQLException:no such column:TRUE:SELECT“drummers”。* FROM“drummers”WHERE(gender = TRUE)

任何人都可以告诉mewhy?

回答

0

这是一个sqlite错误,而不是rails。当你说gender = true时,它正在寻找一个名为true的列。 Sqlite没有布尔值,所以正确的方法是Drummer.where("gender = 1")

0

您应该避免在Arel查询中尽可能使用字符串。

如果您加入的表中还包含一个名为“性别”的字段,那么这将会中断,因为它是不明确的。使用where(:gender => true)将自动为您命名空间,这样就不会发生。

正如您的示例所示,如果您使用的是后端不支持的功能,则使用字符串也会产生可移植性问题。

我一直在使用名为MetaWhere的插件来增强ARel的语法,使得字符串变得不那么必要。