次のキー列を持つワークアウトのテーブルがあります。
workout_id 距離
12.32
3.1
Railsのアクティブレコードクエリを作成して、これらの列と距離の現在の合計を次のように取得するとします。
workout_id 距離 running_total12.3
2.3
2 3.1 5.4
どうすればそのようなことができますか?
次のキー列を持つワークアウトのテーブルがあります。
workout_id 距離
12.32
3.1
Railsのアクティブレコードクエリを作成して、これらの列と距離の現在の合計を次のように取得するとします。
workout_id 距離 running_total12.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 クエリの数に注意してください。おそらくあなたの最善の解決策ではありません。私のコード自体もおそらく最適化される可能性がありますが、他の人がすでに指摘しているように、一般的にあなたのアプローチは最良のアイデアではないかもしれません.