首先让我告诉你我想要什么,我想制作一个用户共同基金组合增长的图表。
现在我有一位用户去年投资了投资组合。
现在我有一个任务存储用户的所有日增长值 用户组合增长表中的投资组合。
截至当前日期,我在用户投资组合增长表中拥有投资组合增长的所有每日价值。
我想要的是在图表上显示用户投资组合的每月增长。
所以,我的问题是如何将所有每日价值转换为他投资日期的月度值?所以,我可以在图表上显示它。
UserPortfolio架构
# == Schema Information
#
# Table name: user_portfolios
#
# id :integer not null, primary key
# user_id :integer not null
# portfolio_name :string
# amount :integer not null
# investment_plan :string not null
# duration :integer default(1), not null
# risk_level :string not null
# created_at :datetime not null
# updated_at :datetime not null
UserPortfolioGrowth
# == Schema Information
#
# Table name: user_portfolio_growths
#
# id :integer not null, primary key
# user_portfolio_id :integer
# appreciated_value :float
# created_at :datetime not null
# updated_at :datetime not null
#
谢谢!
修改 我被问到Tin Man所做的事情: 所以,这是我迄今为止尝试过的演示。
最初我尝试过这种类型的代码:
start = 10.months.ago.to_date
end_date = Date.today
(start..end_date).each do |date|
puts date.end_of_month
end
我得到了一个巨大的结束日期列表,因为它在所有日期都是如此:
2015-07-31
2015-07-31
2015-07-31
2015-07-31
2015-07-31
2015-07-31
2015-07-31
2015-07-31
2015-07-31
2015-07-31
2015-07-31
2015-07-31
2015-07-31
2015-07-31
2015-07-31
2015-07-31
2015-07-31
2015-07-31
2015-07-31
2015-07-31
2015-07-31
2015-07-31
............. and so on...
但是我想要的只是月份的最后一个日期,所以基本上如果我迭代超过10个月,我想要的只有10个值。 因此,我试图通过以下逻辑将指数提前30天。
start = 10.months.ago.to_date
end_date = Date.today
(start..end_date).each do |date|
puts date.end_of_month
date = date.end_of_month + 1.day
end
但我仍然得到以下输出:
2015-07-31
2015-07-31
2015-07-31
2015-07-31
2015-07-31
2015-07-31
2015-07-31
2015-07-31
2015-07-31
2015-07-31
2015-07-31
2015-07-31
2015-07-31
2015-07-31
2015-07-31
2015-07-31
2015-07-31
2015-07-31
2015-07-31
2015-07-31
........................... and so on
我虽然增加索引值可能会改变结果,但事实并非如此。 请有人就此提出任何解决方案吗?
修改
我想我找到了答案,而不是在日期范围内进行迭代,我使用while循环来检查end_date
的条件
这就是我所做的:
start = 10.months.ago.to_date
end_date = Date.today
date_i = start
while(date_i < end_date)
puts date_i.end_of_month
date_i = date_i + 1.month
end
输出:
2015-07-31
2015-08-31
2015-09-30
2015-10-31
2015-11-30
2015-12-31
2016-01-31
2016-02-29
2016-03-31
2016-04-30
答案 0 :(得分:1)
您需要做的是,您必须采取金额或投资的所有价值或您想要的一个月的任何价值。
现在添加它们。
并取平均值。
例如。我们采取当月
total_amount = UserPortfolio.where(created_at: (Date.today.beginning_of_month..Date.today.end_of_month)).pluck(:amount)
average_amount = total_amount.inject(0, :+)/total_amount.count
这将为您提供当月的平均值 同样,你可以获得全年的每一个月。
然后将其放入散列或数组中并在图形中显示它们。
答案 1 :(得分:1)
尝试:
> months_result = user_portfolio.user_portfolio_growths.group_by{|e| e.created_at.strftime('%B')}
> month_with_total = months_result.each{|month, data| [month, data.pluck(:appreciated_value).sum]}.to_h
#=> {"January" => 12546.00, "February" => 56487.00} something like this