Кэширование столбца в полиморфном отношении
-
24-09-2019 - |
Вопрос
У меня есть приложение системы управления контентом, которое использует полиморфную древовидную таблицу в качестве основы своего расположения.Я столкнулся с проблемой, когда, как только дерево становится довольно большим, и поскольку у нас довольно много разных модулей (около 25), простое выполнение :include => :instance не сокращает горчицу.Экземпляр - это имя нашего полиморфного отношения.
Самое смешное, что в большинстве случаев, когда мне нужен большой список этих элементов, все, что мне действительно нужно, - это их название из связанной таблицы (например, для использования в индексной строке), все остальное находится в центральной таблице.Поэтому я подумал, что мне, вероятно, следует реализовать какой-то кеш столбцов для имени в центральной таблице.(Как кэш счетчика, который rails уже использует).
Мне просто интересно, существует ли уже плагин для управления этим?
Если нет, я просто собирался добавить столбец 'name' в центральную таблицу, и поскольку все полиморфные модели наследуют суперкласс, просто добавьте обратный вызов, который передает имя в центральную таблицу всякий раз, когда элемент создается или обновляется.Тогда я бы просто сделал большую миграцию, чтобы заполнить ее в первую очередь?
Есть какие-нибудь недостатки в этом дизайне?
Я полагаю, чтобы быть более гибким, столбец мог бы быть своего рода сериализованным кэшем, где я мог бы хранить другие вещи позже, если понадобится?Боже!:D
Решение
Что ж, чтобы ответить на свой собственный вопрос, я добавил столбец 'cached_name' в центральную таблицу, создал метод 'rebuild_cached_name!', который просто просматривал каждую запись и присваивал кэшированному имени правильное значение.Я вызвал метод rebuild из миграции, который создал столбец кэша.
Затем я изменил метод after_create в моем абстрактном классе (тот, который наследуют полиморфы) и заставил его присвоить cached_name в центральной таблице.Я также добавил вызов метода after_update, который обновляет cached_name всякий раз, когда изменяется обычное имя.
На самом деле довольно просто, но теперь это означает, что больше не нужно вызывать полиморфы в простых ситуациях, таких как генерация индексной строки.