我有一个包含以下关键列的锻炼表:
锻炼 ID 距离
1 2.3
2 3.1
假设我想编写一个 Rails 活动记录查询,以便获得这些列加上运行总距离,如下所示:
锻炼_id距离 running_total
1 2.3 2.3
2 3.1 5.4
我怎么能做这种事?
我有一个包含以下关键列的锻炼表:
锻炼 ID 距离
1 2.3
2 3.1
假设我想编写一个 Rails 活动记录查询,以便获得这些列加上运行总距离,如下所示:
锻炼_id距离 running_total
1 2.3 2.3
2 3.1 5.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
然后在控制器中,只需执行以下操作:
@workouts = Workout.distance_with_running_total
为了更接近对象,虽然这不是最有效的方法,但您可以执行以下操作:
<% 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 查询。可能不是您的最佳解决方案。我的代码本身也可能会得到优化,但总的来说,您的方法可能不是其他人已经指出的最佳主意。