Mutate ActiveRecord对象数组并在单个事务中更新?

时间:2015-11-02 00:20:54

标签: ruby-on-rails activerecord

在单个事务中更新整个ActiveRecord对象数组的首选方法是什么?假设循环中有很多处理。

@items = Item.all

@items.each do |i|
  i.name = somethingDynamic()      
end

#Commit @items to DB in single transaction

2 个答案:

答案 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