Вначале я тоже был озадачен - как это сохранить поездку в базу данных, если вам все равно нужно читать из базы данных, чтобы проверить, действителен ли кэш? Однако см. Комментарии Джесси ( 1 , 2 ) от 12 февраля:
Откуда вы знаете, что такое ключ кеша? Вы должны были бы получить это из базы данных, чтобы знать mtime правильно? Если вы уже извлекаете запись из базы данных, я ожидаю, что это будет самый большой хит, нет?
Я что-то упустил?
, а затем
Пожалуйста, удалите мой мертвый комментарий. Я только что понял, почему это не имеет значения: кэширование происходит каскадно, так что да, полная регенерация глубины вызывает попадание в БД. При следующем попадании в кэш будет выполнен один запрос БД для объекта верхнего уровня - все объекты-потомки не запрашиваются, поскольку кэш для родительского объекта включает в себя кэшированные версии для дочерних элементов (таким образом, запрос не требуется).
И Комментарий Пола Лидера 2 ниже:
Бинго. Вот почему так хорошо работает. Если вы все сделаете правильно, это не просто избавит вас от необходимости генерировать HTML, но и от необходимости попадать в БД. С этой системой кеширования наше приложение для обработки данных практически мгновенно, оно действительно применимо, а код гораздо приятнее.
Итак, учитывая модели, которые DHH перечисляет на шаге 5 статьи, и представления, которые он перечисляет на шаге 6, и учитывая, что вы правильно настроили свои отношения на touch
родительские объекты при обновлении, и учитывая, что ваши частичные обращайтесь к вашим дочерним данным как parent.children
или даже child.children
во вложенных партиалах, тогда эта система кэширования должна иметь чистый выигрыш, поскольку, пока ключ кеша родителя остается в силе, поиск parent.children
никогда не произойдет и будет также вытащить из кеша и т.п.
Однако этот метод может быть бессмысленным, если ваши партиалы ссылаются на множество переменных экземпляра из контроллера, поскольку эти запросы уже будут выполнены к тому времени, когда Rails увидит вызовы cache
в шаблонах представления. В этом случае вам, вероятно, будет лучше использовать другие шаблоны кэширования.
Или, по крайней мере, это мое понимание того, как это работает. НТН