Загрузите коллекцию один раз из БД, используйте по всему сайту - PullRequest
1 голос
/ 07 марта 2011

Я хочу загрузить коллекцию только один раз из БД, поэтому мне не нужно делать это при каждом запросе или сохранять ее в кеше.

Где я могу сделать это в Rails 3?В какой-то момент цикла запуска приложения?

Кроме того, как эта коллекция будет доступна через сайт?

Ответы [ 4 ]

1 голос
/ 07 марта 2011

В config / initializers / constants.rb,

Вы можете сделать это:

SECTOR_NAMES = Sector.all.collect {| sector | sector.name}

и SECTOR_NAMES будут постоянно доступны во всем приложении

1 голос
/ 07 марта 2011

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

class Country
  def self.cached_list
    @cached_list ||= self.all
  end
end

Имейте в виду, что переменные экземпляра класса будут сохраняться в течение всего срока службысам класс.В среде разработки это один запрос, но в производственном процессе это все запросы к одному и тому же процессу.

0 голосов
/ 07 марта 2011

Я использую следующее:

module ReferenceData
  def self.included(model)
    model.instance_eval do
      def self.find_by_sql(*args)
        sql = args.first
        ReferenceDataCache.get(sql) || ReferenceDataCache.put(sql, super)
      end
    end
  end
end

class ReferenceDataCache
  @@cache = {}
  def self.find_by_sql(*args)
    sql = args.first
    ReferenceDataCache.get(sql) || ReferenceDataCache.put(sql, super)
  end

  def self.put(sql, obj)
    Rails.logger.info "[Caching Reference Data Query] #{sql}"
    @@cache[sql] = obj unless obj.empty?
    return obj
  end

  def self.get(sql)
    if @@cache.has_key?(sql)
      return @@cache[sql]
    end
    nil
  end
end

Затем вы можете сделать любой класс ссылочным классом данных, выполнив:

class Cities < AR:B
  include ReferenceData
end
0 голосов
/ 07 марта 2011

Вы можете сохранить его в переменной класса в одной из ваших моделей.

class User < ActiveRecord::Base
  cattr_reader :special
  @@special = User.where(:special => true).all
  ...
end

Он будет оцениваться только во время запуска Rails, если у вас включено кэширование классов (и это по умолчанию для производстваокружающая среда).

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