Варианта два:
1. Сделать рэйк таск, который обойдёт все rateables и просчитает им рейтинги. Но на время работы таска надо будет отключить рейтинги, чтобы не делать даунтайм. Может быть долго, но при этом надёжно.
2. Сделать "мягкое" обновление, в метод rating добавить проверку на существование такого аттрибута в моделе:
def rating
read_attribute(:rating) || create_and_store_rating
end
Правда в этом случае никто не гарантирует что к следующей версии все эти данные обновятся и когда вы решите выкинуть такую мягкую миграцию, ничего не сломается.
3. Совместить оба метода и добавить генерацию метода rating в зависимости от наличия флага в конфигурации гема.
Таким образом, можно будет сделать что-то вроде Mongoid::Rateable.config.silent_migration = true и дать юзеру запустить rake таск. Таким образом те кто будут запрашивать ещё не обновлённые таском данные, будут автоматически добавлять новый аттрибут, а остальные аттрибуты добавятся из таска.
После того как все данные будут обработаны, можно просто выключить в настройках silent_migration (тобишь перестать дефайнить метод rating или дефайнить его уже без создания аттрибута) и всё.
Ну и если развивать мысль в этом направлении, можно придумать ещё как минимум три варианта :)
On Jul 4, 2011, at 8:28 PM, proton wrote:
Извините за название темы - не придумал, как понятно назвать.Есть у меня один гем - https://github.com/proton/mongoid_rateable (мой первый и единственный)Хочу произвести определённые изменения в структуре базы данных (добавить поле rating, и хранить там рейтинг, вместо того, чтобы рассчитывать его каждый раз)Соответственно у тех людей, которые обновят мой гем всё сломается.В идеале хотелось бы произвести изменения (по факту надо заполнить это поле у всех объектов) при обновлении гема.Но данный шаг не возможен (ибо: 1. не уверен, что вообще можно назначить какие-то действия на обновление гема, 2. объекты с рейтингом могут принадлежать каким угодно классам).Что вы можете посоветовать?--
--
Данное сообщение отправлено Вам, так как Вы являетесь подписчиком группы "RubyOnRails to russian" на группах Google.
FAQ группы находится по адресу: http://ru.wikibooks.org/wiki/RubyFAQ
Для того, чтобы отправить сообщение в эту группу, пошлите его по адресу
ror2ru@googlegroups.com
Чтобы отменить подписку на эту группу, отправьте сообщение по адресу: ror2ru-unsubscribe@googlegroups.com
Дополнительные варианты находятся на странице группы http://groups.google.com/group/ror2ru?hl=ru
Комментариев нет:
Отправить комментарий