Что касается кеширования, пара незначительных баллов:
Стоит использовать косую черту для разделения типа объекта и идентификатора, что является соглашением о рельсах. Более того, модели ActiveRecord предоставляют метод экземпляра cacke_key, который предоставит уникальный идентификатор имени и идентификатора таблицы, "towns / 13" и т. Д.
Одна небольшая поправка к вашему фильтру after_save. Поскольку у вас есть данные под рукой, вы можете записать их обратно в кеш, а не удалять их. Это сэкономит вам одну поездку в базу данных;)
def after_save
Rails.cache.write(cache_key,self)
end
Что касается сути вопроса, если вы постоянно тянете @ user.city.name, есть два реальных варианта:
- Денормализовать название города пользователя в строке пользователя. @ user.city_name (сохранить внешний ключ city_id). Это значение должно быть записано во время сохранения.
-или-
- Реализуйте свой метод User.fetch, чтобы загружать город. Делайте это только в том случае, если содержимое строки города никогда не меняется (например, имя и т. Д.), В противном случае вы можете открыть банку с червями в отношении аннулирования кэша.
Личное мнение:
Реализуйте базовые методы выборки на основе идентификатора (или используйте плагин) для интеграции с memcached и денормализуйте название города в строке пользователя.
Лично я не большой поклонник кешированных плагинов в стиле модели, я никогда не видел ни одного, который сэкономил бы значительное количество времени на разработку, из которого я не торопился.
Если вы получаете слишком много запросов к базе данных, определенно стоит проверить готовность к загрузке (через: include), если вы еще этого не сделали. Это должно стать первым шагом к сокращению количества запросов к базе данных.