过去24个月的捐款和钥匙和金额

时间:2013-09-03 21:36:38

标签: ruby-on-rails ruby-on-rails-3

在过去两年中已经提取了捐款,我试图得出每月捐款的总和,将钥匙(每个月)和价值(每个月的捐款总额)存储在一系列哈希中。我希望关键是数字1到24(1年是两年前,24年是本月),如果某个月没有捐款,那个月的价值将为零。我如何在Ruby / Rails中以哈希数组的形式执行此操作?

这是我的变量,其中已有捐款。

donations = Gift.where(:date => (Date.today - 2.years)..Date.today)

3 个答案:

答案 0 :(得分:1)

以下为您提供哈希,键'2013/09'等等......

 monthly_donations = {}
 date = Time.now
 while date > 2.years.ago do 

   range = date.beginning_of_month..date.end_of_month
   monthly_donations[ "{#date.year}/#{date.month}" ] = Giftl.sum(:column, :conditions => {created_at >= range})

   date -= 30.days
 end

要选择该时间跨度内的记录,这应该足够了:

 donations = Gift.where("date >= #{2.years.ago}") 

你也可以这样做:

 donations = Gift.where("date >= :start_date AND date <= :end_date",
                         {start_date: 2.years.ago, end_date: Time.now} )

另见:2.2.1“占位符条件”       http://guides.rubyonrails.org/active_record_querying.html

要总结数据库记录中的列,您可以执行以下操作:

 sum = Gift.sum(:column , :conditions => {created_at >= 2.years.ago})

答案 1 :(得分:0)

首先,我们需要一个函数来查找与当前时间相差几个月的差异。

def month_diff(date)
  (Date.current.year * 12 + Date.current.month) - (date.year * 12 + date.month)
end

然后我们迭代@donation,假设:金额用于存储每笔捐款的价值:

q = {}
@donations.each do |donation|
  date = month_diff(donation.date)
  if q[date].nil?
    q[date] = donation.amount
  else
    q[date] += donation.amount
  end
end

答案 2 :(得分:0)

我找到了一个涵盖所有基础的好解决方案 - @ user1185563的解决方案在没有捐款的情况下没有带来数月,@ Tilo称为数据库24次,但我非常感谢这些想法!我确信这可以更有效地完成,但我创建了包含24个元素的哈希(键:每个月的开头,值:0),然后迭代捐赠并将其金额添加到适当位置的哈希值。 / p>

def monthly_hash
  monthly_hash = {}
  date = 2.years.ago
  i = 0
  while date < Time.now do
    monthly_hash["#{date.beginning_of_month}"] = 0
    date += 1.month
    i += 1
  end
  return monthly_hash
end

@monthly_hash = monthly_hash
@donations.each do |donation|
  @monthly_hash["#{donation.date.beginning_of_month}"] += donation.amount
end