Rails будет кэшировать запрос, который автоматически загружает события, поэтому вам не нужно явно кэшировать события.Однако, чтобы это работало, вам нужно преобразовать события в массив перед вычислением суммы;events.sum
означает, что вы хотите создать SQL-запрос для вычисления суммы, и он не будет работать.
Измените модель Program
следующим образом:
Program < ActiveRecord::Base
has_many :events
def federal_financing
events.to_a.sum(&:federal_financing)
end
def regional_financing
events.to_a.sum(&:regional_financing)
end
def local_financing
events.to_a.sum(&:local_financing)
end
end
Теперь, с помощьюВключив запись ActiveRecord в консоли, легко увидеть, что запросы действительно кэшируются:
$ script/console
>> ActiveRecord::Base.logger = Logger.new(STDOUT)
>> p = Program.first
Program Load (1.0ms) SELECT * FROM "programs" LIMIT 1
=> #<Program id: 1, created_at: "2010-06-08 15:01:08", updated_at: "2010-06-08 15:01:08">
>> p.federal_financing
Event Load (1.0ms) SELECT * FROM "events" WHERE ("events".program_id = 1)
=> 147
>> p.regional_financing
=> 23
>> p.local_financing
=> 11
Как видите, события загружаются только один раз, во время первого вызова federal_financing
.