在一个调用/查询中创建多个Rails ActiveRecord记录

时间:2011-06-10 10:03:00

标签: sql ruby-on-rails activerecord

在我的一个Rails应用程序的AR类中,我最终获得了许多新初始化的ActiveRecord对象的数组。

我希望能够以一种有效的方式将它们保存到数据库中,理想情况是,在一个方法调用中。目前,我将它们包含在交易中。

类似的东西:

Object.transaction do
  @objects.map(&:save)
end

是否有更有效的解决方案来创建/更新记录数组?

2 个答案:

答案 0 :(得分:7)

您可以将所有内容包装到事务中,因为数据库只会刷新并更新一次索引。

您无法在标准SQL中的单个SQL语句中插入多个对象。 MySQL可以做到这一点,但这是非默认的。我怀疑这有很大的性能优势。

如果这段代码真的是时间关键,你可以异步运行它(通过将它移动到后台线程 - 注意ActiveRecord和多线程存在问题 - 或者让它由工作程序执行。或者你可以生成SQL手工制作 - AR在这方面的效率并不是非常高效。但是,只有在非常关键的情况下,我才会那种方式,然后将其视为黑客攻击。

答案 1 :(得分:2)

我建议使用activerecord-import gem,直到主线activerecord支持批量插入。

使用起来相当简单,例如批量插入一堆“评级”记录:

# Example database record/model
class Rating < ActiveRecord::Base

end

ratings = []

# Create some fake data here..
100.times do |i|
    ratings << Rating.new({ stars: (rand * 5).to_i }) # random star rating
end

# Bulk import ratings (single query)
Rating.import(ratings) 
相关问题