Кэширование столбца в полиморфных отношениях - PullRequest
1 голос
/ 03 марта 2010

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

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

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

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

Есть ли недостатки этого дизайна?

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

1 Ответ

0 голосов
/ 08 марта 2010

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

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

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

...