Ruby / Rails字符串数组到PostgreSQL插入

目前,我有一个rails项目,我试图将活动记录转到直接postgres,以便使用字符串数组进行大批量创建,其中值尚不存在(以避免重复)。 我面临的问题是试图逃避包含’或(等,在所述ruby数组中的字符串字符,以便postgres接受。)示例如下(显然它不起作用):

Ruby数组:

array_of_strings = ["example one's value", "example (2) value"] sql = "INSERT INTO TABLE (column) SELECT column FROM TABLE UNION VALUES #{array_of_strings} EXCEPT SELECT column FROM TABLE;" ActiveRecord::Base.connection.execute(ActiveRecord::Base.send(:sanitize_sql_array, sql)) 

对于像这样的东西,我会忽略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 } 

应该做的伎俩和安全。