4

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 の合計が常に返されます。何か助けはありますか?

4

0 に答える 0