【问题标题】:Rails 3 connection.execute IN statement parameters array syntaxRails 3 connection.execute IN 语句参数数组语法
【发布时间】:2012-08-26 08:57:40
【问题描述】:

我有一个关于 Rails 3 ActiveRecord::Base.connection.execute 方法和参数的语法问题,我想使用它。我已经为此奋斗了几个小时,似乎在互联网上找不到任何关于这个特定问题的答案。

数据库是 MySQL。

我需要通过带有 IN 条件语句的 SELECT 创建一个临时表,其中 IN 应该检查的值列表是一个参数 - rails Array。代码如下所示:

arr = [1,2,3]
ActiveRecord::Base.connection.execute("CREATE TEMPORARY TABLE things SELECT * FROM objects WHERE objects.id IN #{arr}") 

我得到一个 MySQL 语法错误!

ActiveRecord::Base.connection.execute("CREATE TEMPORARY TABLE things SELECT * FROM objects WHERE objects.id IN #{(arr)}") 

又是 MySQL 语法错误!

ActiveRecord::Base.connection.execute("CREATE TEMPORARY TABLE things SELECT * FROM objects WHERE objects.id IN (#{arr})") 

MySQL 语法错误

以上尝试对应这个问答: How to execute arbitrary parameterized SQL in rails

我什至尝试过使用 find_by_sql 的方式,但仍然报错:

ActiveRecord::Base.connection.execute(["CREATE TEMPORARY TABLE things SELECT * FROM objects WHERE objects.id IN (:ids)",{:ids => arr }]) - obviously, I get an MySQL error. 

我是否遗漏了一些明显的东西?请帮忙!我完全需要这种方式(例如,创建具有完全这种条件的临时表),否则基于此的更复杂的查询将不起作用。谢谢!

【问题讨论】:

    标签: mysql ruby-on-rails ruby-on-rails-3 sql-parametrized-query


    【解决方案1】:

    这是另一个使用 Rails 查询清理的选项

    arr = [1,2,3]
    query = "SELECT * FROM objects where id IN (?)"
    query = ActiveRecord::Base.send :sanitize_sql_array, [query, arr]
    ActiveRecord::Base.connection.execute(query)
    

    【讨论】:

      【解决方案2】:

      如果你转换arr.to_s,你会得到"[1, 2, 3]"

      我认为arr.join(', ') 应该可以工作。

      ActiveRecord::Base.connection.execute("CREATE TEMPORARY TABLE things SELECT * FROM objects WHERE objects.id IN (#{arr.join(', ')})")
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2010-10-21
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2017-01-05
        相关资源
        最近更新 更多