Rails には、次のように SQL に直接渡す sum 関数があります。
User.find(1).books.sum(:pages_count)
SELECT SUM("books"."pages_count") AS sum_id FROM "books" WHERE "books"."user_id" = 1
=> 3024
しかし、コントローラーを使用している場合は、次のように熱心な読み込みを行うことができます。
users = User.limit(10).includes(:books)
users.first.books.map(&:pages_count).sum
=> 4325
この方法では、2 つの SQL クエリのみを実行し、残りは Ruby コードです。
リレーションが熱心にロードされているかどうかを検出し、正しい合計関数を選択できるメソッドを実行しようとしていますが、そのような運はありません。
これが私のコードです:
module ActiveRecord
module Calculations
def smart_sum(column = :value)
puts self.loaded?
if loaded?
collect {|x| x[column] }.sum
else
sum(column)
end
end
end
end
奇妙なことにロードされた?ビットはメソッドで機能しないため、SQL の合計が常に返されます。何か助けはありますか?