ruby-on-rails - Ruby/Rails 字符串数组到 PostgreSQL 插入

标签 ruby-on-rails ruby arrays postgresql activerecord

目前,我有一个 Rails 项目,我正在尝试绕过事件记录到直接 postgres,以便使用字符串数组进行大批量创建,其中的值尚不存在(以避免重复)。我面临的问题是试图转义在所述 ruby​​ 数组中包含 ' 或 (, ect.. 的字符串字符,以便 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
}

应该做到这一点并且是安全的。

关于ruby-on-rails - Ruby/Rails 字符串数组到 PostgreSQL 插入,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/26394419/

相关文章:

ruby - 具有范围值的数组?

ruby - 未定义方法 `%' 对于 nil :NilClass

c# - 如何按顺序初始化 C# 中的字符串数组,其值从 "AAAAAA"到 "ZZZZZZ"

java - 反转数组中的元素

mysql - RoR - rake rs :index fails with NameError on Rails 4. 0.4(4.1.7),思考狮身人面像 3.1.1

mysql - Rails 4 使用不同的数据库和不同的表

javascript - 所见即所得文本区域编辑器的 CKEditor 替代品

ruby-on-rails - cucumber 找不到已安装的 gem

ruby - block 作为 ruby​​ 中方法的参数是一个谜?

c - 为什么我的数组在作为参数传递时被删除?