Memcached всегда скучаю (рельсы) - PullRequest
       3

Memcached всегда скучаю (рельсы)

4 голосов
/ 03 сентября 2010

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

У меня есть класс с этим методом:

def telecom_info

    Rails.cache.fetch("telecom_info_for_#{ref_num}", :expires_in=> 3.hours) do
      info = Hash.new(0)
      Telecom::SERVICES.each do |source|
          results = TelecomUsage.find(:all, 
                                      :joins=>[:telecom_invoice=>{ :person=> :org_person}], 
                                      :conditions=>"dotted_ids like '%#{ref_num}%' and telecom_usages.ruby_type = '#{source}'", 
                                      :select=>"avg(charge) #{source.upcase}_AVG_CHARGE,
                                                max(charge) #{source.upcase}_MAX_CHARGE,
                                                min(charge) #{source.upcase}_MIN_CHARGE,
                                                sum(charge) #{source.upcase}_CHARGE,

                                                avg(volume) #{source.upcase}_AVG_VOLUME,
                                                max(volume) #{source.upcase}_MAX_VOLUME,
                                                min(volume) #{source.upcase}_MIN_VOLUME,
                                                sum(volume) #{source.upcase}_VOLUME
                                                ")

          results = results.first
          ['charge', 'volume'].each do |source_type|                                        
            info["#{source}_#{source_type}".to_sym] = results.send("#{source}_#{source_type}".downcase).to_i
            info["#{source}_min_#{source_type}".to_sym] = results.send("#{source}_min_#{source_type}".downcase).to_i
            info["#{source}_max_#{source_type}".to_sym] = results.send("#{source}_max_#{source_type}".downcase).to_i
            info["#{source}_avg_#{source_type}".to_sym] = results.send("#{source}_avg_#{source_type}".downcase).to_i
          end
      end

      return info
    end
end

Как видите, это дорогой вызов, и он называется ALOT для каждого запроса, поэтому я хочу его кешировать.Проблема в том, что memcached не работает, в файле журнала я получаю:

Чтение кэша: telecom_info_for_60000000

Отсутствие кэша: telecom_info_for_60000000 ({})

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

Есть предложения?Я использую Rails 2.3.5 на REE 1.8.7

1 Ответ

7 голосов
/ 03 сентября 2010

Заменить return info на info.

Rails.cache.fetch("telecom_info_for_#{ref_num}", :expires_in=> 3.hours) do
  # ...
  info
end

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

Сравните следующее:

def my_method
  1.upto(3) do |i|
    # Calling return immediately causes Ruby to exit the current method.
    return i
  end
end

my_method
#=> 1

Как правило: всегда опускайте return, если только вы действительно не хотите выйти из текущего блока и вернуться из текущего метода.

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