このような場合は、ActiveRecordの引用とエスケープを無視して、ActiveRecord::Base.connection.quote
に直接移動します。 。
最終的に作成しようとしているSQLは次のようなものです:
INSERT INTO TABLE (column)
SELECT column FROM TABLE
UNION VALUES ('example one''s value'), ('example (2) value')
EXCEPT SELECT column FROM TABLE
quote
を使用できます '
を変換するには ''
へ (SQLは一重引用符を二重にしてエスケープすることに注意してください)が、VALUESに適切な括弧を自分で追加する必要があります。接続のquote
メソッドは、外側の一重引用符も追加します。
このようなもの:
values = array_of_strings.map { |s| "(#{ActiveRecord::Base.connection.quote(s)})" }.join(',')
続いて:
sql = %Q{
INSERT INTO TABLE (column)
SELECT column FROM TABLE
UNION VALUES #{values}
EXCEPT SELECT column FROM TABLE
}
トリックを実行し、安全である必要があります。