Ruby on Rails:基于其他列数据汇总表列行值

时间:2009-10-15 06:11:34

标签: ruby-on-rails activerecord

我有一个包含列'id','resource_id','read_time','value'的表,其中'value'是一个浮点数

我想要完成的是返回一个记录列表,使每条记录的“值”是特定“read_time”但具有不同“resource_id”值的所有记录的总和。

我想知道是否有一种聪明的方法(即不循环遍历所有条目)来实现这一目标。目前我正在实施这些方面:

@aggregate_meters = []
@res_one_meters = Meter.find(:all, :conditions => ["resource_id = ?", 1])

@res_one_meters.each do |meter|
  read_time = meter.read_time
  value = meter.value
  if res_two_meter = Meter.find(:first, :conditions => ["resource_id = ? AND read_time = ?", 2, read_time ])
    value = value + res_two_meter.value
  end
  aggregate_meter = Meter.new(:read_time => read_time, :value => value, :resource_id => 3)
  @aggregate_meters.push(aggregate_meter)
end

谢谢。

1 个答案:

答案 0 :(得分:5)

ActiveRecord :: Calculate是你的朋友。让您通过一次数据库调用完成所需的操作。它使用组中使用的列中的唯一值作为键返回哈希值。

这是您编写的代码,重写为使用sum。

values = Meter.sum(:value, :group => :read_time)

values.each do |read_time, value|
  aggregate_meter = Meter.new(:read_time => read_time, :value => value, :resource_id => 3)
  @aggregates_meter.push(aggregate_meter)
end