АктивРесурс + Кэширование

Я создаю приложение, которое использует модели через API с ActiveResource. Я заметил, что

@resource ||= @resource.do a query 

не работает, т.е. если я поставлю что-то подобное в свой контроллер, мое приложение все равно будет запрашивать API. Таким образом, нет встроенного кэширования, к которому я привык в ActiveRecord. Время расширить свои знания и базу навыков, хорошо.

Я нашел это: http://injectisforwizards.com/blog/read-through-caching-of-activeresource/, и хотя я еще не понимаю этого на 100%, для запросов на основе контроллера, которые выполняют .find, похоже, это работает. Но не для каких-либо пользовательских запросов, которые у меня есть, например:

@current_resource ||= Resource.get(:resource_all, :by_account=>@current_account.account_key)

(который попадает в пользовательский контроллер и запускает область, возвращая коллекцию)

Я работаю над этим, и я узнаю, что происходит, но мне любопытно, может ли кто-нибудь сказать мне более простыми словами, что происходит, что я могу сделать, чтобы сгладить кэширование в ActiveResource, чтобы оно было больше похоже на ActiveRecord, как Я могу адаптировать это для кэширования всех запросов и т. Д. Все, что действительно было бы полезно.

РЕДАКТИРОВАТЬ:

Я нашел это: https://github.com/Ahsizara/cached_resource, который выглядит многообещающе, но он новый ( и построен на основе этой ссылки выше).... примечательно то, что он, похоже, не обрабатывает какие-либо коллекции, но для одного ресурса хорошо находит/кеширует.


person blueblank    schedule 03.12.2011    source источник


Ответы (1)


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

def show
  @resource ||= expensive_request
end

Что вы ожидаете от @resource при выполнении этого метода? Результат чего-то из предыдущего вызова show? Не произойдет.

Что вам нужно сделать, так это поместить вещи в Rails.cache, если вы хотите, чтобы они сохранялись между запросами. Если вы используете memcached в качестве серверной части, это может быть очень эффективно. Дополнительную информацию о разделе 2.5 см. в руководстве по Кэширование с помощью Rails.

В общем, лучший подход, чем ||= метод кэширования, состоит в том, чтобы определить защищенные методы, заключенные в memoize, чтобы сохранить результаты. Например:

def load_resource
  expensive_request
end
memoize :load_resource

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

person tadman    schedule 03.12.2011
comment
Что ж, во второй половине моего вопроса я тестировал решение, но оказалось, что оно на самом деле не работает и выдает ошибку при фактическом запуске, поэтому я все еще ищу решения. Мне любопытно посмотреть, что происходит с решением по упомянутой ссылке - person blueblank; 04.12.2011