在单个事务中更新整个ActiveRecord对象数组的首选方法是什么?假设循环中有很多处理。
@items = Item.all
@items.each do |i|
i.name = somethingDynamic()
end
#Commit @items to DB in single transaction
答案 0 :(得分:1)
您可以简单地将整个循环包装在事务中:
@items = Item.all
ActiveRecord::Base.transaction do
@items.each do |i|
i.name = somethingDynamic()
i.save!
end
end
答案 1 :(得分:0)
您可以使用concatWith
显式启动事务,如下所示:
ActiveRecord::Base.transaction
这将在一个事务中运行一堆Item.transaction do
@items.each do |i|
i.name = something_dynamic()
i.save!
end
end
语句,并在第一次失败时回滚事务(因为save!将引发异常)。
如果你想做一些不需要一堆更新语句的东西,你可以用raw sql做一个更新语句,如下所示:
UPDATE items set name = x