Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/ruby-on-rails/62.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/ruby-on-rails-3/4.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Ruby on rails 过去24个月的捐款,包括钥匙和金额_Ruby On Rails_Ruby On Rails 3 - Fatal编程技术网

Ruby on rails 过去24个月的捐款,包括钥匙和金额

Ruby on rails 过去24个月的捐款,包括钥匙和金额,ruby-on-rails,ruby-on-rails-3,Ruby On Rails,Ruby On Rails 3,在提取了过去两年的捐款后,我试图得到每个月的捐款总额,将每个月的密钥和每月捐款总额的值存储在一系列散列中。我希望数字是1到24,1是两年前的数字,24是这个月的数字,如果某个月没有捐款,那么该月的值将为零。在Ruby/Rails中,作为一个哈希数组,我将如何做到这一点 这是我的变量,里面已经有捐款了 donations = Gift.where(:date => (Date.today - 2.years)..Date.today) 下面给出了一个散列,其中包含键'2013/09,等等

在提取了过去两年的捐款后,我试图得到每个月的捐款总额,将每个月的密钥和每月捐款总额的值存储在一系列散列中。我希望数字是1到24,1是两年前的数字,24是这个月的数字,如果某个月没有捐款,那么该月的值将为零。在Ruby/Rails中,作为一个哈希数组,我将如何做到这一点

这是我的变量,里面已经有捐款了

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

下面给出了一个散列,其中包含键'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} )

下面给出了一个散列,其中包含键'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} )

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

def month_diff(date)
  (Date.current.year * 12 + Date.current.month) - (date.year * 12 + date.month)
end
然后我们迭代@generation,假设:amount用于存储每个捐赠的价值:

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

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

def month_diff(date)
  (Date.current.year * 12 + Date.current.month) - (date.year * 12 + date.month)
end
然后我们迭代@generation,假设:amount用于存储每个捐赠的价值:

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

我找到了一个很好的解决方案,它涵盖了所有的基础,@user1185563的解决方案在没有捐款的情况下无法带来数月的收益,@Tilo已经24次调用数据库,但我非常感谢这些想法!我相信这可以更有效地完成,但我创建了一个包含24个元素的散列。键:每个月初,值:0,然后遍历捐赠,并将它们的金额添加到适当位置的散列中

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

我找到了一个很好的解决方案,它涵盖了所有的基础,@user1185563的解决方案在没有捐款的情况下无法带来数月的收益,@Tilo已经24次调用数据库,但我非常感谢这些想法!我相信这可以更有效地完成,但我创建了一个包含24个元素的散列。键:每个月初,值:0,然后遍历捐赠,并将它们的金额添加到适当位置的散列中

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

对不起,也许我没有很好地沟通,但我不仅仅需要过去两年的捐款——我需要过去24个月每个月的捐款总额,没有捐款的月份的捐款总额为零。散列怎么样?以后处理起来更容易一些很好,谢谢,这很好!在每月捐款的插值中有一点输入错误,并将日期更改了1.5个月,以消除月长的变化,但除此之外,这正是我需要的。对不起,我想我说得太早了。您的解决方案确实很有帮助,我在最终解决方案中引用了它,但它需要24个数据库调用,这比我需要的效率要低。我想出了一个解决方案,看看我的答案,它利用了你的一些概念和@user1185563。很好。问题是你如何从你的捐赠模型中获得记录——另一张海报没有解释他想如何做到这一点。你应该使用find_each而不是find,看:对不起,也许我没有很好地沟通,但我不仅仅需要过去两年的捐款,我需要过去24个月每个月的捐款总额,在没有捐款的月份,它的值为零。散列怎么样?以后处理起来更容易一些。非常好,谢谢,效果很好!在每月捐款的插值中有一点输入错误,并将日期更改了1.5个月,以消除月长的变化,但除此之外,这正是我需要的。对不起,我想我说得太早了。您的解决方案确实很有帮助,我在最终解决方案中引用了它,但它需要24个数据库调用,这比我需要的效率要低。我想出了一个解决方案,看看我的答案,它利用了你的一些概念和@user1185563。很好。问题是你如何从你的捐赠模型中获得记录——另一张海报没有解释他想如何做到这一点。您应该使用find_each而不是find,请参见: