Rails за запрос хеш? - PullRequest
       13

Rails за запрос хеш?

15 голосов
/ 19 марта 2009

Есть ли способ кешировать данные по запросу в Rails? Для данного запроса Rails / mongrel у меня есть результат недорогой операции, к которой я хотел бы получить доступ несколько раз позже в этом запросе. Есть ли хеш, где я могу хранить и получать доступ к таким данным?

Он должен быть достаточно глобальным и доступным из представлений, контроллеров и библиотек, как это делают Rails.cache и I18n.

Я в порядке, я делаю кое-какие исправления, если это то, что нужно.

  • Memcached не работает, потому что он будет разделен между запросами, а я не хочу.
  • Глобальная переменная также не работает, потому что разные запросы будут использовать одни и те же данные, а это не то, что мне нужно.
  • Переменные экземпляра не работают, потому что я хочу получить доступ к данным из разных классов.

Ответы [ 7 ]

6 голосов
/ 03 февраля 2013

Существует также request_store драгоценный камень. Из документации:

Добавьте эту строку в Gemfile вашего приложения:

gem 'request_store'

и использовать этот код для хранения и извлечения данных (ограничивается запросом):

# Set
RequestStore.store[:foo] = 0

# Get
RequestStore.store[:foo]
4 голосов
/ 30 августа 2009

Попробуйте PerRequestCache . Я украл дизайн из кэша SQL-запросов.

Настройте его в config/environment.rb с помощью:

config.middleware.use PerRequestCache

затем используйте его с:

PerRequestCache.fetch(:foo_cache){ some_expensive_foo }
2 голосов
/ 11 апреля 2015

Один из самых популярных вариантов - использовать драгоценный камень request_store, который позволяет вам получить доступ к глобальному магазину из любой части вашего кода. Он использует Thread.current для хранения ваших данных и заботится об очистке данных после каждого запроса.

RequestStore[:items] = []

Имейте в виду, что, поскольку он использует Thread.current, он не будет работать должным образом в многопоточной среде, где у вас более одного потока на запрос.

Чтобы обойти эту проблему, я реализовал хранилище, которое можно разделить между потоками для одного и того же запроса. Он называется request_store_rails, он ориентирован на многопотоковое исполнение и очень похож:

RequestLocals[:items] = []
1 голос
/ 19 марта 2009

Глобальные переменные являются злом. Узнайте, как аккуратно передать нужные данные туда, где вы хотите их использовать.

0 голосов
/ 19 марта 2009

мемоизация

Согласно это Railscast хранится по запросу.

0 голосов
/ 19 марта 2009

приложение / модели / my_cacher.rb

class MyCacher
  def self.result
    @@result ||= begin
      # do expensive stuff
      # and cache in @@result
    end
  end
end

Синтаксис || = в основном означает «делать следующее, если @@ result is nil» (т. Е. Еще ничего не установлено). Просто убедитесь, что последняя строка в начале / конце блока возвращает результат.

Тогда в ваших представлениях / моделях / что бы вы ни ссылались на функцию, когда вам это нужно:

MyCacher.result

Это кеширует дорогостоящее действие на время запроса.

0 голосов
/ 19 марта 2009

Рассматривали ли вы вспышку? Он использует сеанс, но автоматически очищается.

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