Ruby on rails 3 Rails和活动记录中的运行总数

Ruby on rails 3 Rails和活动记录中的运行总数,ruby-on-rails-3,activerecord,Ruby On Rails 3,Activerecord,我有一个包含以下关键列的训练表: 训练\u id距离 12.3 23.1 假设我想写一个Rails活动记录查询,这样我可以得到这些列加上运行总距离,如下所示: 训练id距离跑步总量 12.32.3 23.15.4 我怎么能做这样的事情呢?我同意HungryCoder的观点,即您可能应该在模型中而不是在数据库查询中进行操作 class Workout # ... attr_accessor :running_total class << self def dista

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

训练\u id距离
12.3
23.1

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

训练id距离跑步总量
12.32.3
23.15.4


我怎么能做这样的事情呢?

我同意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

要使其更靠近对象,尽管这不是最有效的方法,但您可以执行以下操作,例如:

<% 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查询。可能不是你最好的解决方案。我的代码本身也可能会得到优化,但一般来说,您的方法可能不是其他人已经指出的最佳方法。

最好在获取记录后再这样做!对于累积,您可能需要依赖子查询,这将是缓慢的!在保存我的记录的对象中是否有这样做的方法?假设返回的记录存储在
训练中
,是否有办法将此
running\u total
属性添加到每个记录中,基本上混合了ActiveRecord和此临时属性?谢谢。在尽可能避免繁重的SQL方面,这对我来说是一个很好的学习。
<% 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 %>