1

我有一个包含以下关键列的锻炼表:

锻炼 ID      距离
1 2.3
2 3.1

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

      锻炼_id距离      running_total 1 2.3 2.3 2 3.1 5.4


我怎么能做这种事?

4

2 回答 2

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
于 2012-10-23T19:48:35.683 回答
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 查询。可能不是您的最佳解决方案。我的代码本身也可能会得到优化,但总的来说,您的方法可能不是其他人已经指出的最佳主意。

于 2012-10-23T21:50:59.067 回答