Ruby on rails 如何使用Arel批量插入?

Ruby on rails 如何使用Arel批量插入?,ruby-on-rails,ruby,postgresql,ruby-on-rails-4,arel,Ruby On Rails,Ruby,Postgresql,Ruby On Rails 4,Arel,我有如下循环,它创建了许多插入: 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

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

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
但是,我想找到一种方法,只获取要插入的值。在这种情况下,我将能够为所有值执行单个插入

PS:请注意,我不想写sql字符串(安全问题)

table=Arel::table.new(:用户)
插入=[]
用户。每个do |用户|
manager=Arel::InsertManager.new(ActiveRecord::Base)
插入(表)。插入([
[表[:名称],user.name],
[表[:created_at],user.created_at],
[表[:updated_at],user.updated_at]
])

inserts本月早些时候推出了一个名为。这将为您提供所需的功能:

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

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

由于这是一个相当新的库,而且我还没有机会使用它,所以我不确定它的Arel功能。

本月早些时候推出了一个库,名为。这将为您提供所需的功能:

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

# Produces:
INSERT INTO models (...) VALUES
  (...),
  (...),
  (...),
  (...),
  ...
由于它是一个相当新的库,而且我还没有机会使用它,所以我不确定它的Arel功能。

你可以使用。

你可以使用。

看看(感谢@Gavin Miller),我意识到它们使用的Rails可以防止sql注入

因为我需要定制的东西,所以我不想买宝石。因此,如果其他人有类似要求,我的最终解决方案如下:

inserts = []
users.each do |user|
  inserts << %{(
    #{@conn.quote(user.name)},
    #{@conn.quote(user.created_at)},
    #{@conn.quote(user.updated_at)}
  )}
end

sql = %{
  INSERT INTO users
  (name, created_at, updated_at)
  VALUES #{inserts.join(',')}
}

@conn.execute(sql)
inserts=[]
用户。每个do |用户|
inserts看着(多亏了@gavinmiller),我意识到它们使用的Rails可以防止sql注入

因为我需要定制的东西,所以我不想买宝石。因此,如果其他人有类似要求,我的最终解决方案如下:

inserts = []
users.each do |user|
  inserts << %{(
    #{@conn.quote(user.name)},
    #{@conn.quote(user.created_at)},
    #{@conn.quote(user.updated_at)}
  )}
end

sql = %{
  INSERT INTO users
  (name, created_at, updated_at)
  VALUES #{inserts.join(',')}
}

@conn.execute(sql)
inserts=[]
用户。每个do |用户|

插入如果您的AREL版本已经支持
创建元组
,它将如下所示:

        table = Table.new(:users)
        manager = Arel::InsertManager.new
        manager.into table

        manager.columns << table[:id]
        manager.columns << table[:name]

        manager.values = manager.create_tuple([
          manager.create_values(%w{ 1 david }),
          manager.create_values(%w{ 2 kirs }),
          manager.create_values(["3", Arel.sql('DEFAULT')], []),
        ])

        # INSERT INTO "users" ("id", "name") VALUES ('1', 'david'), ('2', 'kirs'), ('3', DEFAULT)
      end
table=table.new(:用户)
manager=Arel::InsertManager.new
经理把他放进桌子里

manager.columns如果您的AREL版本已经支持
create\u tuple
,它将类似于:

        table = Table.new(:users)
        manager = Arel::InsertManager.new
        manager.into table

        manager.columns << table[:id]
        manager.columns << table[:name]

        manager.values = manager.create_tuple([
          manager.create_values(%w{ 1 david }),
          manager.create_values(%w{ 2 kirs }),
          manager.create_values(["3", Arel.sql('DEFAULT')], []),
        ])

        # INSERT INTO "users" ("id", "name") VALUES ('1', 'david'), ('2', 'kirs'), ('3', DEFAULT)
      end
table=table.new(:用户)
manager=Arel::InsertManager.new
经理把他放进桌子里
经理.专栏