2

Rails 3 ActiveRecord::Base.connection.execute メソッドと一緒に使用したいパラメーターに関する構文の質問があります。私はこれと数時間戦っていますが、インターネット上でこの特定の質問に対する答えが見つからないようです.

データベースはMySQLです。

IN条件ステートメントを使用してSELECTを使用して一時テーブルを作成する必要があります.INがチェックする値のリストはパラメーター-rails配列です。コードは次のようになります。

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 構文エラー

上記の試みは、この質問と回答に対応しています: レールで任意のパラメーター化された SQL を実行する方法

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. 

明らかな何かが欠けていますか?助けてください!私はこれをまさにこの方法で必要とします(たとえば、まさにそのような条件で一時テーブルを作成します)。そうしないと、これに基づくより複雑なクエリは機能しません。ありがとう!

4

2 に答える 2

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)
于 2014-09-24T15:07:31.310 に答える
1

変換すると、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(', ')})")
于 2012-08-31T14:42:07.973 に答える