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