2016-07-30 103 views
0

我有2個型號UserOrder。我需要生成一個圖表,它將檢索數組中的月度餘額。在我的Order表中,我有earningscosts。以下是我想出了一些遠:N + 1查詢問題

user.rb

class User < ActiveRecord::Base 

def baltime(time) #This will return balance based on time 
    orders.where("created_at < ?", time).map(&:earning).compact.inject(:+).to_f - 
    orders.live.where("created_at < ?", time).map(&:costs).compact.inject(:+).to_f 
end 

def group_by_months 
    result = [] 
    forteenmonths = 14.times.map { |i| (Date.today - (i).month)}.reverse 
    forteenmonths.each do |d| 
    result << self.baltime(d) 
    end 
    result #This will return an array of the order balances 
end 

地,上述方法的工作,但是,它會調用從數據庫中查詢14。有沒有更好的方法可以解決N + 1問題?在此先感謝

回答

0

這是我的方式與2查詢做到這一點,但代碼有點複雜。首先我計算所有earnings 14個月並將它們存儲到一個數組,然後從這些月份減去costs以獲得每個月的最終balance

def group_by_months 
    earnings = orders.order(:created_at).pluck(:earning, :created_at) 
    costs = orders.live.order(:created_at).pluck(:cost, :created_at) 

    result = [0] 
    i = 0 
    date = Date.today - 13.months 

    earnings.each do |earning, created_at| 
    if created_at > date 
     i += 1 
     result[i] = result[i-1] 
     date = date + 1.month 
    end 
    result[i] += earning 
    end 

    i = 0 
    date = Date.today - 13.months 

    costs.each do |cost, created_at| 
    if created_at > date 
     i += 1 
     result[i] = result[i-1] 
     date = date + 1.month 
    end 
    result[i] -= cost 
    end 

    result 
end