2015-11-02 4 views
0

Каков предпочтительный способ обновления всего массива объектов ActiveRecord в одной транзакции? Предположим, что в цикле много обработки.Mutate Array объектов ActiveRecord и обновление в одной транзакции?

@items = Item.all 

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

#Commit @items to DB in single transaction 

ответ

1

Вы можете просто обернуть весь цикл в рамках сделки:

@items = Item.all 

ActiveRecord::Base.transaction do 
    @items.each do |i| 
    i.name = somethingDynamic() 
    i.save!  
    end 
end 
0

Вы можете начать транзакцию явно с ActiveRecord::Base.transaction, как это:

Item.transaction do 
    @items.each do |i| 
    i.name = something_dynamic() 
    i.save! 
    end 
end 

Это запустит кучу UPDATE items set name = x операторы в одной транзакции и отложить транзакцию на первый сбой (поскольку save! будет генерировать исключение).

Если вы хотите сделать что-то, что не требует кучи заявлений обновлений, вы можете сделать одно заявление обновления с сырым SQL как это:

`@items.update_all("name = sql_func(name)")` 
Смежные вопросы