簡體   English   中英

在Rails中的一個ActiveRecord事務中更新多個記錄

[英]Update multiple records in one ActiveRecord transaction in Rails

如何使用Rails中的事務塊一次更新/保存模型的多個實例?

我想更新數百條記錄的值; 每條記錄的值都不同。 不是一個屬性的批量更新情況。 Model.update_all(attr:value)在這里不合適。

MyModel.transaction do
    things_to_update.each do |thing|
        thing.score = rand(100) + rand(100)
        thing.save
    end
end

save似乎發布它自己的事務,而不是將更新批處理到周圍的事務中。 我希望所有更新都進入一次重大交易。

我怎么能做到這一點?

假設你知道你想用ids 1,2和3來設置得分,分別為8,8和64(而不是隨機數),你可以:

UPDATE 
  things AS t
SET
  score = c.score
FROM 
  (values
    (1, 2),
    (2, 30),
    (4, 50)
  ) as c(id, score) 
 where c.id = t.id;

所以使用Rails,你可以使用ActiveRecord::Base.connection#execute來執行類似於上面的塊,但是插入了正確的值字符串。

我不確定,但是你可能會混淆多個查詢的 多個事務

您發布的代碼將創建單個事務(例如,如果發生異常,則將回滾所有更新),但每次save將導致單獨的更新查詢。

如果可以使用SQL而不是Ruby代碼執行更新,那么這可能是最好的方法。

我認為你需要改變方法“保存”到“保存!”。 如果任何更新失敗,方法保存! 生成異常。 當事務塊中發生異常時,事務會反轉整個操作(回滾)

MyModel.transaction do
    things_to_update.each do |thing|
    thing.score = rand(100) + rand(100)
    thing.save!
end

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM