获得动态更新的统计数据每月铁路

时间:2014-09-10 11:30:14

标签: ruby datetime ruby-on-rails-4

我有Rails4应用程序。

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方法的查询中(这是一种愚蠢和一次性的方式),我想知道是否有(我相信有)这样做的方法很好,很顺利。

对任何提示都表示赞赏!

2 个答案:

答案 0 :(得分: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

答案 1 :(得分: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