2012-05-26 56 views
0

我有一個Rails 3.2應用程序跟蹤訂閱訂單的郵件。Rails的ActiveRecord性能與許多選擇和插入

基本模型結構爲:

訂購的has_many訂閱的has_many SubscriptionMailings

產生爲每個訂閱郵件記錄每個月和CSV文件是從這些記錄中導出。

郵寄地址存儲在訂單級別。

基本上,我選擇所有有效的郵件訂閱,並通過它們循環獲取訂單對象的郵寄地址。然後我爲每一個創建一個新的訂閱郵件記錄。

現在這工作正常,因爲沒有很多的訂閱,但它很慢。

我該如何加快這個過程?

+0

你可以發佈日誌摘錄,將顯示我們的查詢與他們的持續時間?也是純粹的數據庫操作需要這麼長時間,還是有一些應用程序級別的邏輯(回調,觀察者或複雜的驗證)? – Renra

回答

0

一些研究,我結束了我的包裹在一個交易代碼,而無需進行其他任何更改後。

它加速了一些事情。

在我添加交易之前,代碼需要花費1分鐘的時間才能運行,現在已經下降到大約10秒鐘。這足夠滿足我的需求,所以我沒有嘗試進一步優化。

ActiveRecord::Base.transaction do 
    # my db stuff here 
end 
0

爲了優化,您需要從Ruby級別降級到SQL級別。

而不是做N+1選擇的(1用於獲取所有訂閱和N用於獲取所有訂單爲每個訂閱),您可能能夠做到只用1加入選擇。

SubscriptionMailing. 
    joins(:subscrtiption). 
    joins(:order). 
    where(Order.table_name => { valid: true }) 
0

聽起來像你想使用包括急於加載訂單。也許是這樣的:

# Subscription.rb 
scope :valid_for_month lambda {|month| where(month: month)} 

# Elsewhere 
valid_subscriptions = Subscription.valid_for_month(Time.now.month).includes(:order) 
valid_subscriptions.each do |subscription| 
    subscription.generate_subscription_mailing 
end 

更多包括:http://api.rubyonrails.org/classes/ActiveRecord/Associations/ClassMethods.html