基于Eager Loading的Rails中的智能总和?

时间:2012-08-10 00:36:27

标签: ruby-on-rails activerecord

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总和。 有什么帮助吗?

0 个答案:

没有答案