在我的Rails應用程序的一個AR類中,我結束了一個包含許多新初始化的ActiveRecord對象的數組。在一個調用/查詢中創建多個Rails ActiveRecord記錄
我希望能夠以有效的方式將它們保存到數據庫中,理想情況下只需一次方法調用即可。目前,我把它們包裝在一個交易中。
是這樣的:
Object.transaction do
@objects.map(&:save)
end
是有一種更有效的解決方案來創建/更新的記錄數組?
在我的Rails應用程序的一個AR類中,我結束了一個包含許多新初始化的ActiveRecord對象的數組。在一個調用/查詢中創建多個Rails ActiveRecord記錄
我希望能夠以有效的方式將它們保存到數據庫中,理想情況下只需一次方法調用即可。目前,我把它們包裝在一個交易中。
是這樣的:
Object.transaction do
@objects.map(&:save)
end
是有一種更有效的解決方案來創建/更新的記錄數組?
如果你正確地將所有東西都包裝到一個事務中,那麼數據庫只會刷新一次並更新索引。
不能在標準SQL中的單個SQL語句中插入許多對象。 MySQL可以做到這一點,但這是非默認的。我懷疑這是否有巨大的性能優勢。
如果這段代碼是非常重要的,可以異步運行它(通過將它移動到後臺線程中 - 注意ActiveRecord和多線程有問題 - 或者讓它由工作人員執行)或者可以生成SQL手工 - AR不這樣做非常有效的。然而,我想我建議使用activerecord-import寶石,直到主線去是方式只有當這是非常重要的,並且會認爲這是一個黑客然後
。 activerecord支持批量插入
它的使用相當簡單,例如批量插入一堆「R ating「記錄:
# Example database record/model
class Rating < ActiveRecord::Base
end
ratings = []
# Create some fake data here..
100.times do |i|
ratings << Rating.new({ stars: (rand * 5).to_i }) # random star rating
end
# Bulk import ratings (single query)
Rating.import(ratings)
同意。只需要確保我沒有錯過任何東西。我還糾正了DB調用方法調用,因爲這是目的。我檢查了類方法'update_all',並想知道在創建新記錄時是否有類似的用法。 – cnicolaou 2011-06-10 10:30:00
您可以使用像activerecord-import這樣的gem批量插入。 – 2014-11-16 05:03:35
@Corey:你應該添加一個單獨的答案。畢竟一個單獨的gem可以真正將大量每個數據庫優化引入到大量導入中。 (儘管我不相信activerecord-import實際上是這樣做的,我希望看到它的一些基準。) – radiospiel 2014-11-18 08:15:10