Вопрос

У меня есть приложение системы управления контентом, которое использует полиморфную древовидную таблицу в качестве основы своего расположения.Я столкнулся с проблемой, когда, как только дерево становится довольно большим, и поскольку у нас довольно много разных модулей (около 25), простое выполнение :include => :instance не сокращает горчицу.Экземпляр - это имя нашего полиморфного отношения.

Самое смешное, что в большинстве случаев, когда мне нужен большой список этих элементов, все, что мне действительно нужно, - это их название из связанной таблицы (например, для использования в индексной строке), все остальное находится в центральной таблице.Поэтому я подумал, что мне, вероятно, следует реализовать какой-то кеш столбцов для имени в центральной таблице.(Как кэш счетчика, который rails уже использует).

Мне просто интересно, существует ли уже плагин для управления этим?

Если нет, я просто собирался добавить столбец 'name' в центральную таблицу, и поскольку все полиморфные модели наследуют суперкласс, просто добавьте обратный вызов, который передает имя в центральную таблицу всякий раз, когда элемент создается или обновляется.Тогда я бы просто сделал большую миграцию, чтобы заполнить ее в первую очередь?

Есть какие-нибудь недостатки в этом дизайне?

Я полагаю, чтобы быть более гибким, столбец мог бы быть своего рода сериализованным кэшем, где я мог бы хранить другие вещи позже, если понадобится?Боже!:D

Это было полезно?

Решение

Что ж, чтобы ответить на свой собственный вопрос, я добавил столбец 'cached_name' в центральную таблицу, создал метод 'rebuild_cached_name!', который просто просматривал каждую запись и присваивал кэшированному имени правильное значение.Я вызвал метод rebuild из миграции, который создал столбец кэша.

Затем я изменил метод after_create в моем абстрактном классе (тот, который наследуют полиморфы) и заставил его присвоить cached_name в центральной таблице.Я также добавил вызов метода after_update, который обновляет cached_name всякий раз, когда изменяется обычное имя.

На самом деле довольно просто, но теперь это означает, что больше не нужно вызывать полиморфы в простых ситуациях, таких как генерация индексной строки.

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top