2014-09-10 51 views
0

我有Rails4應用程序。獲取動態更新統計月度rails

class Developer 
has_many :client_applications 

class ClientApplication 
belongs_to :developer 

ClientApplication's屬性有cost

什麼我能做的,就是通過讓開發者的總營收中:

def total_earning 
    self.client_applications.where(status: "Closed").map{|c| c.cost}.inject(&:+).to_i 
end 

我想是有統計資料的表格。表應該有month列和total_earning列,並且對應此month值。

我只想獲得total_earning非零值的列(如果開發人員在2月份獲得$ 0,本月不在表中)。

我可以將月份硬編碼爲total_earning方法的查詢(這是愚蠢的和一次性的方式),我想知道是否有(我確定有)一種方法來做到這一點很好,順利。

對於任何提示將不勝感激!

+0

您想要將聚合數據存儲在您的數據庫中作爲加快速度的一種方法? – Anthony 2014-09-10 13:27:08

+0

最初的目標是讓管理員輕鬆快速地看到開發人員的收入。他總是可以去開發人員檔案,查找他的項目,查看日期和狀態,選擇那些在當月關閉的項目(如果有的話),並計算支付給開發人員的資金。但是當有很多開發者時 - 它變得非常容易出錯並且效率低下 – 2014-09-10 13:30:08

回答

0

所以解決方案,我想出來的(ActiveAdmin表):

 table do 
     Hash[*developer.client_applications.load.where(status: "Closed").group_by{|a| [a.updated_at.month, a.updated_at.year]}.map{|a,b| ["#{Date::MONTHNAMES[a[0]]} #{a[1]}", b.map(&:cost).map(&:to_i).inject(&:+)]}.reject{|entry| entry[1] == [0, nil]}.flatten].each_pair do |k, v| 
      tr do 
      td k 
      td number_to_currency(v, unit: "$") 
      end 
     end 
     end 
0

你可以每次ClientApplication保存記錄更新統計資料表像這次做回調:

class Developer 
has_many :client_applications 

補充一點:

class ClientApplication 
belongs_to :developer 
after_save :update_statistics 

def update_statistics 
    if self.status == "Closed" 
    stats = Statistic.find_or_create_by(developer: self.developer, month: self.created_at) 
    stats.total_earning += self.cost 
    stats.save 
    end 
end 

class Statisitc 
has_many :developers 
has_many :client_applications 
+0

嘿!非常感謝這個提議!我用一種不同的方式解決了這個問題 – 2014-09-11 06:34:13