在Rails和Active Record中运行总计

时间:2012-10-23 17:41:03

标签: ruby-on-rails-3 activerecord

我有一个包含以下关键列的训练表:

workout_id 距离
1个2.3
2 3.1

假设我想写一个Rails活动记录查询,以便我得到这些列加上距离的运行总计,如下所示:

workout_id 距离 running_total
1个2.3 2.3
2个3.1 5.4

我怎么能这样做?

2 个答案:

答案 0 :(得分:2)

我同意HungryCoder你应该在模型中而不是在数据库查询中这样做。

class Workout
  # ...
  attr_accessor :running_total
  class << self
    def distance_with_running_total
      total = 0.0
      Workout.order(:id).collect do |w|
        total += w.distance
        w.running_total = total
      end
    end
  end
  # ...
end

然后在控制器中,只需执行:

@workouts = Workout.distance_with_running_total

答案 1 :(得分:0)

为了更接近对象,虽然这不是最有效的方法,但你可以这样做:

<% Workout.all.map{|x| x.attributes}.each_with_index{|e, i| e["running_total"] = Workout.all.take(i + 1).map{|x| x.distance}.inject{|sum,x| sum + x}}.each do |workout| %>
    <%= workout["id"] %>
    <%= workout["distance"] %>
    <%= workout["running_total"] %>
<% end %>

但请注意这个执行了多少个SQL查询。可能不是你最好的解决方案。我的代码本身也可能会得到优化,但总的来说,你的方法可能不像其他人已经指出的那样最好。