我有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
方法的查询中(这是一种愚蠢和一次性的方式),我想知道是否有(我相信有)这样做的方法很好,很顺利。
对任何提示都表示赞赏!
答案 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