在我的一个Rails应用程序的AR类中,我最终获得了许多新初始化的ActiveRecord对象的数组。
我希望能够以一种有效的方式将它们保存到数据库中,理想情况是,在一个方法调用中。目前,我将它们包含在交易中。
类似的东西:
Object.transaction do
@objects.map(&:save)
end
是否有更有效的解决方案来创建/更新记录数组?
答案 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)