将Ruby数组作为值传递给SQL


insert into table_name (attr1, attr2) VALUES 
(1, 2),
(3, 4)
;

我想在表"table_name"中插入值。但我想让它充满活力。我在ruby中有数组形式的值,如下所示:

[[1, 2], [3, 4]]

如何将ruby数组作为值传递给sql查询?我正在使用rails和postgres。

您可以使用Arel::InsertManager生成SQL插入语句:

def insert_list(table_name:, columns:, values:)
Arel::InsertManager.new.tap do |manager|
table = Arel::Table.new(table_name)
manager.into(table)
columns.each do |name|
manager.columns << table[name.to_sym]
end
manager.values = manager.create_values_list(values)
end
end
insert_list(
table_name: :foos, 
columns: [:bar, :baz],
values: [[1, 2], [3, 4], [5, 6], [7, 8], [9, 10]]
).to_sql
# => "INSERT INTO "foos" ("bar", "baz") VALUES (1, 2), (3, 4), (5, 6), (7, 8), (9, 10)"

假设你有一个模型,你可以使用ActiveRecord的insert_all

Model.insert_all([{attr1: 1, attr2: 2}, {attr1: 3, attr2: 4}])

与地图的连接将在这里工作:

[[1, 2], [3, 4]].map{|inner| inner.join(", ")}
# => ["1, 2", "3, 4"]
[[1, 2], [3, 4]].map{|inner| inner.join(", ")}.join("),n(")
# => "1, 2),n(3, 4"
"(" + [[1, 2], [3, 4]].map{|inner| inner.join(", ")}.join("),n(") + ")"
# => "(1, 2),n(3, 4)"
puts "(" + [[1, 2], [3, 4]].map{|inner| inner.join(", ")}.join("),n(") + ")"
# (1, 2),
# (3, 4)

请注意,这是一个简单的解决方案。在生产应用程序中,如果数组值[[1, 2], [3, 4]]来自不受信任的源(用户!(,则需要对其进行清理,以避免SQL注入攻击。但这似乎超出了这个问题的范围。

最新更新