В ActiveRecord, как указать атрибут класса, который рассчитывается только один раз для продолжительности страницы? - PullRequest
3 голосов
/ 16 февраля 2010

Допустим, у меня есть ActiveRecord с именем Apples, и я хочу метод класса, который вычисляет общую стоимость каждого яблока в моей базе данных, например:

def Apples.total_price
  Apples.sum(:price)
end

Это метод, который я использую в одном из моих представлений для создания круговой диаграммы. Итак, что-то вроде: Apples.brand («красный вкусный»). Sum (: price) /Apples.total_price =% от круговой диаграммы

Apples.brand ("fuji"). Sum (: price) /Apples.total_price = еще один% от круговой диаграммы

Apples.total_price вызывается многократно, но в этот момент значение не изменится. А) Делает ли Rails запрос неоднократно, или он знает, что кэшировать значение? И если он вызывает его несколько раз, каков наилучший способ определить метод в Apple, чтобы эта total_price только один раз вычислялась для времени выполнения этого представления?

Ответы [ 2 ]

4 голосов
/ 16 февраля 2010

То, как вы это определили, я полагаю, это делается неоднократно. Логи покажут наверняка.

С помощью техники, известной как запоминание, вы обрабатываете ее только в случае необходимости. Rails обеспечивает легкое запоминание для методов экземпляра, но вы сами для методов класса.

Вот как вы создаете свою собственную памятку для метода класса.

class Apple < ActiveRecord::Base
  cattr_reader :total_price

  def Apple.total_price
    @@total_price ||= Apples.sum(:price)
  end
end
1 голос
/ 16 февраля 2010

первый путь

def total_price
  @total_price ||= calc_total_price
end

Существует также метод памятки. так что вы можете сделать это так же

def total_price
  #you long running code goes here
end
memoize :total_price

Здесь вы можете найти некоторые детали:

http://ryandaigle.com/articles/2008/7/16/what-s-new-in-edge-rails-memoization

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...