このような場合は、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
}
トリックを実行し、安全である必要があります。