我有如下循环,它创建了许多插入:

table = Arel::Table.new(:users)
users.each do |user|
  manager = Arel::InsertManager.new(ActiveRecord::Base)
  manager.into(table).insert([
    [table[:name], user.name],
    [table[:created_at], user.created_at],
    [table[:updated_at], user.updated_at]
  ])
  # INSERT INTO users (name) VALUES ('a')
  @conn.insert(manager.to_sql)
end

但是,我想找到一种方法,只获取要插入的值。在这里,我可以对所有值执行一次插入。
注:请注意,我不想写sql字符串(安全问题)。
table = Arel::Table.new(:users)
inserts = []
users.each do |user|
  manager = Arel::InsertManager.new(ActiveRecord::Base)
  manager.into(table).insert([
    [table[:name], user.name],
    [table[:created_at], user.created_at],
    [table[:updated_at], user.updated_at]
  ])
  inserts << "(#{??manage values??})"
end
# INSERT INTO users (name) VALUES ('a'), ('b'), ('c')
@conn.insert(????)

最佳答案

这个月早些时候有一个图书馆,叫做bulk_insert。这将为您提供所需的功能:

Model.bulk_insert do |worker|
  worker.add(...)
  worker.add(...)
  ...
end

# Produces:
INSERT INTO models (...) VALUES
  (...),
  (...),
  (...),
  (...),
  ...

因为这是一个相当新的图书馆,我还没有机会玩它,我不确定它的阿雷尔能力。

09-04 10:59
查看更多