Rails 3 connection.execute IN 语句参数数组语法

zim*_*ima 2 mysql ruby-on-rails sql-parametrized-query ruby-on-rails-3

我有一个关于 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}") 
Run Code Online (Sandbox Code Playgroud)

我收到一个 MySQL 语法错误!

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

再次MySQL语法错误!

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

MySQL 语法错误

以上尝试对应这个问答: How to execute任意参数化的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. 
Run Code Online (Sandbox Code Playgroud)

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

joh*_*nml 5

这是使用 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)
Run Code Online (Sandbox Code Playgroud)