想象一下这个场景,
我有一个表Day_fee(日期(日期),费用(整数))
我想要一个只包含表格月份的列表,例如:
Day_fee
date(Date) fee(Int)
----------|---------
2012/03/27 1
2012/03/26 2
2012/03/25 2
2012/05/01 3
2012/05/02 3
2012/07/01 2
2013/04/01 2
2013/05/01 1
结果=> 03,05和07的清单,不再重复几个月。
还有一个大问题:
我想要一个月份和年份的哈希列表,例如{“03”=>“2012”,“04”=>“2013”,“05”=>“2013”,“05 “=>”2012“,”07“=>”2012“},没有重复几个月,也许表可以在同一个月有更多年份
因为在那之后,我想显示一个带有月份和分页的html表。
思想?
感谢您的帮助。
答案 0 :(得分:1)
试试这个:
如果您使用的是Postgres DB
# Postgres
DayFee.sum(:fee, :group => "EXTRACT(MONTH FROM date)")
=> #<OrderedHash {"3" => 5, "5"=> 6, "7"=> 2}
如果您使用的是MySQL
DayFee.sum(:fee, :group => "MONTH(date)")
修改强>
根据您的评论,您似乎想要一个不同的数据:
<强>的Postgres 强>
DayFee.count(:fee, :group => "date_trunc('month', date)").
map{|d, k| Date.parse(d)}.
inject({}){|h, d| h[d.month]=d.year;h}
<强>的MySQL 强>
DayFee.count(:fee, :group => "DATE_FORMAT(date, '%Y-%m')").
map{|d, k| Date.parse(d+"-00 00:00")}.
inject({}){|h, d| h[d.month]=d.year;h}
获取2D数组
DayFee.count(:fee, :group => "date_trunc('month', date)",
:order => "date_trunc('month', date) ASC").
map{|d, k| Date.parse(d)}.
map{|h, d| [d.month, d.year]}
# [["03", "2012"], ["03", "2013"], ["03", "2014"]]
获取年份集合的哈希
DayFee.count(:fee, :group => "date_trunc('month', date)").
map{|d, k| Date.parse(d)}.
inject({}){|h, d| (h[d.month]||=[]) << d.year;h}
# {"03" => ["2012", "2013", "2014"]}
答案 1 :(得分:1)
Rails 3.2的最短字符串是DayFee.pluck(:date).map(&:month).uniq
,但更快的解决方案取决于db,而postgres是DayFee.select("EXTRACT(MONTH FROM date) as month").group(:month).map(&:month)
答案 2 :(得分:0)
我想你想要GROUP method的ActiveRecord,然后在mySQL中使用Month() function。
Day_fee.select("Month(date) as month, sum(fee) as sum_fee)").group("Month(date)")
这应该返回一个带有三个月和费用总和的Day_fee对象。
答案 3 :(得分:0)
如果DayFee表很小,我会使用:
DayFee.all.map{ |df| df.date.month }.uniq
如果DayFee表很大,请使用以下之一:
# Rails 3.2+
# Never used pluck, but I think it works this way
DayFee.select("MONTH(date) as month").group_by(:month).pluck(:month)
# Rails < 3.2
DayFee.connection.select_values "select MONTH(date) as month from day_fees group by month"
答案 4 :(得分:0)
由于您存储的是日期,而不仅仅是月份名称(数字),因此您需要获取所有日期的列表:
DayFee.select(:date).uniq ## active record should generate the correct distinct statement to avoid data redundancy
比你能找到独特的月份:
DayFee.select(:date).uniq.map{|d| d.gsub(/.+\/(.+)\/.+/, '\1')}.uniq