2014-04-01 79 views
1

我正在尝试在ActiveRecord 4中编写此查询,但无济于事。ActiveRecord从组中获取平均值

SELECT date, AVG(gain) AS avg_gain FROM counters WHERE (date > '2014-03-03' ) GROUP BY date ORDER BY date DESC; 

所以我炒了一起:

Counter.select("date, AVG(gain) as avg_gain").where("date > '2014-03-03'").group(:date).order(date: :desc) 
=> #<ActiveRecord::Relation [#<Counter id: nil, date: "2014-04-01">, #<Counter id: nil, date: "2014-03-31">, #<Counter id: nil, date: "2014-03-30">, #<Counter id: nil, date: "2014-03-29">, #<Counter id: nil, date: "2014-03-28">, #<Counter id: nil, date: "2014-03-27">, #<Counter id: nil, date: "2014-03-26">, #<Counter id: nil, date: "2014-03-25">, #<Counter id: nil, date: "2014-03-24">, #<Counter id: nil, date: "2014-03-23">, ...]> 

唯一的麻烦是,该结果不包含avg_gain列。有任何想法吗?

回答

3

当您使用select时,所选字段将添加到返回的关系中的实例。返回的结果不包括打印输出中的所选字段。

访问这些字段,就像你访问一个列的属性:

result = Counter.select("date, AVG(gain) as avg_gain").where("date > '2014-03-03'").group(:date).order(date: :desc) 
result.first.avg_gain # Prints expected value for the first Counter 
+0

有什么办法,我可以掐出来?像'Counter.select(“date,AVG(gain)as avg_gain”)。其中(“date>'2014-03-03'”)。group(:date).order(date::desc).pluck(:日期,“avg_gain”)'? –

+0

@JanNetherdrake你可以做'result.map {| counter | [counter [:date],counter [:avg_gain]]}'返回像[[[date,avg],[date,avg],...] – MrYoshiji