如何仅列出结果Active Record的一列

时间:2012-03-01 18:12:16

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

想象一下这个场景,

我有一个表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表。

思想?

感谢您的帮助。

5 个答案:

答案 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