4

Rails 有一个 sum 函数,可以像这样直接进入 SQL:

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

这样你只做两个 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

奇怪的加载?bit 在该方​​法中不起作用,因此始终返回 SQL 总和。有什么帮助吗?

4

0 回答 0