【问题标题】:How do I perform a matches query on an integer attribute in Rails如何在 Rails 中对整数属性执行匹配查询
【发布时间】:2014-05-22 17:42:02
【问题描述】:

如果我有一个带有 id(integer) 的 users 表,并且我尝试使用 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'"

【问题讨论】:

    标签: mysql ruby-on-rails arel


    【解决方案1】:

    这是因为您尝试在 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"
    

    希望对你有帮助。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2017-08-12
      • 1970-01-01
      • 2021-12-22
      • 2012-03-29
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多