如果我有一个带有id(整数)的用户表,我尝试使用arel构建一个sql查询,我就明白了。
users = Arel::Table.new(:users)
users.where(users[:id].matches("foo")).to_sql #=> "SELECT FROM `users` WHERE `users`.`id` LIKE 0"
我需要生成这个sql:
"SELECT FROM `users` WHERE `users`.`id` LIKE 'foo'"
我觉得那里有某种不必要的类型铸造的地方。
更新
我终于通过使用Arel :: Nodes :: SqlLiteral类的实例解决了这个问题。
str = Arel::Nodes::SqlLiteral.new("'foo'")
users.where(users[:id].matches(str)).to_sql #=> "SELECT FROM `users` WHERE `users`.`id` LIKE 'foo'"
答案 0 :(得分:0)
这是因为您尝试在INT
类型列上构建查询。因此,Rails试图转换' foo'到Integer
,0
。
以下将为列的正确数据类型生成预期查询:
users.where(users[:name].matches("foo")).to_sql #=> "SELECT FROM `users` WHERE `users`.`name` LIKE 'foo'"
所以,在你的情况下,你应该尝试这样的事情:
users.where(users[:id].matches(1)).to_sql #=> "SELECT FROM `users` WHERE `users`.`id` LIKE 1"
我希望它有所帮助。