ActiveResource + Кэширование - PullRequest
       33

ActiveResource + Кэширование

1 голос
/ 03 декабря 2011

Я создаю приложение, которое использует модели через 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, что выглядит многообещающе, но это ново (и построено на этой ссылке выше) ....Примечательно, что он, похоже, не обрабатывает какие-либо коллекции, но для одного ресурса хорошо находит / кэширует.

1 Ответ

0 голосов
/ 04 декабря 2011

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

def show
  @resource ||= expensive_request
end

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

То, что вам нужно сделать, это поместить вещи в Rails.cache, если вы хотите, чтобы они сохранялись между запросами. Если вы используете memcached в качестве серверной части, это может быть очень эффективным. См. Руководство Caching with Rails для получения дополнительной информации о разделе 2.5.

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

def load_resource
  expensive_request
end
memoize :load_resource

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

...