2011-06-10 84 views
4

在我的Rails應用程序的一個AR類中,我結束了一個包含許多新初始化的ActiveRecord對象的數組。在一個調用/查詢中創建多個Rails ActiveRecord記錄

我希望能夠以有效的方式將它們保存到數據庫中,理想情況下只需一次方法調用即可。目前,我把它們包裝在一個交易中。

是這樣的:

Object.transaction do 
    @objects.map(&:save) 
end 

是有一種更有效的解決方案來創建/更新的記錄數組?

回答

7

如果你正確地將所有東西都包裝到一個事務中,那麼數據庫只會刷新一次並更新索引。

不能在標準SQL中的單個SQL語句中插入許多對象。 MySQL可以做到這一點,但這是非默認的。我懷疑這是否有巨大的性能優勢。

如果這段代碼是非常重要的,可以異步運行它(通過將它移動到後臺線程中 - 注意ActiveRecord和多線程有問題 - 或者讓它由工作人員執行)或者可以生成SQL手工 - AR不這樣做非常有效的。然而,我想我建議使用activerecord-import寶石,直到主線去方式只有當這是非常重要的,並且會認爲這是一個黑客然後

+0

同意。只需要確保我沒有錯過任何東西。我還糾正了DB調用方法調用,因爲這是目的。我檢查了類方法'update_all',並想知道在創建新記錄時是否有類似的用法。 – cnicolaou 2011-06-10 10:30:00

+0

您可以使用像activerecord-import這樣的gem批量插入。 – 2014-11-16 05:03:35

+0

@Corey:你應該添加一個單獨的答案。畢竟一個單獨的gem可以真正將大量每個數據庫優化引入到大量導入中。 (儘管我不相信activerecord-import實際上是這樣做的,我希望看到它的一些基準。) – radiospiel 2014-11-18 08:15:10

2

。 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) 
相關問題