![](/img/trans.png)
[英]Update multiple records simultaneously with ActiveRecord in Rails using one query?
[英]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.