У меня дорогой (трудоемкий) внешний запрос к другому веб-сервису, который мне нужно сделать, и я бы хотел его кешировать. Поэтому я попытался использовать эту идиому , поместив в контроллер приложения следующее:
def get_listings
cache(:get_listings!)
end
def get_listings!
return Hpricot.XML(open(xml_feed))
end
Когда я вызываю get_listings!
в моем контроллере, все круто, но когда я вызываю ] get_listings
Rails жалуется, что не было дано ни одного блока. И когда я смотрю на этот метод, я вижу, что он действительно ожидает блок, и, кроме того, похоже, что этот метод предназначен только для использования в представлениях? Так что я предполагаю, что, хотя не было указано, что это просто псевдокод.
Итак, мой вопрос, как мне кэшировать что-то подобное? Я пробовал различные другие способы, но не мог понять это. Спасибо!
Как предполагает nruth, встроенное хранилище кеша Rails, вероятно, то, что вам нужно.
Попробуйте:
def get_listings
Rails.cache.fetch(:listings) { get_listings! }
end
def get_listings!
Hpricot.XML(open(xml_feed))
end
fetch() извлекает кэшированное значение для указанного ключа или записывает результат блока в кэш, если он не существует.
По умолчанию кеш Rails использует хранилище файлов, но в рабочей среде предпочтительным вариантом является memcached.
См. раздел 2 http://guides.rubyonrails.org/caching_with_rails.html для более подробной информации.
подход в коде может выглядеть примерно так:
def get_listings
@listings ||= get_listings!
end
def get_listings!
Hpricot.XML(open(xml_feed))
end
который будет кэшировать результат для каждого запроса (новый экземпляр контроллера для каждого запроса), хотя вы можете посмотреть на помощники «memoize» в качестве опции API.
Если вы хотите совместно использовать запросы , не сохраняйте данные в объектах класса, так как ваше приложение не будет потокобезопасным, если вы не разбираетесь в параллельном программировании и создании убедитесь, что потоки не мешают друг другу получать доступ к данным к общей переменной.
«Способ Rails» кэшировать запросы — это хранилище Rails.cache. Memcached часто используется, но вы можете обнаружить, что хранилища файлов или памяти соответствуют вашим потребностям. Это действительно зависит от того, как вы развертываете и хотите ли вы расставить приоритеты в кэше, времени отклика, хранилище (ОЗУ) или использовать размещенное решение, например. аддон хероку.