понедельник, 4 июля 2011 г.

Re: Изменение полей в бд при обновлении gem'а (mongoid)

Вот в вашем случае колонка должна быть если не опциональной, то при отсутствии значения там высчитываться и потом только записываться. Своего рода кеширование. Это как depth в нестед сете. Есть аттрибут в бд  читается из него, нет аттрибута - высчитывается. Изменилась глубина вложенности - если есть аттрибут - пишется новое значение, нет аттрибута - ну и ладно. Мне кажется - это самый правильный вариант.

4 июля 2011 г. 23:53 пользователь Alexey Bondar <alexey.bondar@gmail.com> написал:
Варианта два: 

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

--
--
Данное сообщение отправлено Вам, так как Вы являетесь подписчиком группы "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

--
--
Данное сообщение отправлено Вам, так как Вы являетесь подписчиком группы "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

Комментариев нет:

Отправить комментарий