Относительно кэширования, нескольких деталей:
стоит использовать наклонную черту для разделения типа объекта и идентификатора, который является соглашением направляющих. Еще лучше модели ActiveRecord обеспечивают cacke_key метод экземпляра, который обеспечит уникальный идентификатор имени таблицы и идентификатора, "города/13" и т.д.
Одно незначительное исправление к Вашему фильтру after_save. Так как у Вас есть данные под рукой, Вы могли бы также записать их обратно к кэшу в противоположность, удаляют его. Это сохраняет Вас единственное прохождение в базу данных;)
def after_save Rails.cache.write(cache_key,self) end
относительно корня вопроса при непрерывном получении по запросу @user.city.name существует два реальных варианта:
- или
Личное мнение: Реализуйте основные основанные на идентификаторе методы выборки (или используйте плагин) интегрироваться с memcached и денормализовывать название города к строке пользователя.
я - лично не огромный поклонник кэшируемых образцовых плагинов стиля, я никогда не видел тот, который это сохранило существенное количество времени разработки, из которого я не вырос второпях.
, Если Вы получаете слишком много запросов базы данных, определенно стоит проверить нетерпеливую загрузку (через: включайте), если Вы уже не имеете. Это должно быть первым шагом для сокращения количества запросов базы данных.
Я шел бы вперед и смотрел бы на Memoization, который находится теперь в направляющих 2.2.
"Memoization является шаблоном инициализации метода однажды и затем прятание его значение для повторного использования".
было великое эпизод Railscast на нем недавно, который должен разбудить Вас и работающий приятно.
Быстрый пример кода от Railscast:
class Product < ActiveRecord::Base
extend ActiveSupport::Memoizable
belongs_to :category
def filesize(num = 1)
# some expensive operation
sleep 2
12345789 * num
end
memoize :filesize
end