Миграция базы данных Rails/Mongoid

В настоящее время я работаю над приложением для рельсов, где мы используем mongoid/mongoDB на сервере. Я понимаю, что мне не нужен ActiveRecord, такой как миграция, для переноса схемы, но мне нужно перенести данные, когда я изменяю определения модели mongoid. Кто-нибудь еще сталкивается с таким же сценарием, если да, то как вы с этим справляетесь?


person Mark S.    schedule 27.03.2012    source источник
comment
github.com/adacosta/mongoid_rails_migrations   -  person rubish    schedule 28.03.2012


Ответы (4)


Напишите пользовательскую задачу rake для переноса данных по мере необходимости.

person cpjolicoeur    schedule 27.03.2012
comment
Спасибо. Я думал об этом, но мне нужно, чтобы это было запущено один раз. - person Mark S.; 27.03.2012
comment
я не понимаю. Вы можете легко запускать задачу rake один или столько раз, сколько хотите. Запустите его один раз, а затем удалите задачу. - person cpjolicoeur; 27.03.2012
comment
Поэтому я хочу, чтобы он запускался один раз, а затем имел какую-то запись о том, что он был запущен, поэтому он никогда не будет запускаться снова, пока эта запись остается в базе данных. Однако я не думал просто удалить код после его запуска. - person Mark S.; 27.03.2012
comment
ну, вы можете сделать свою задачу rake умной и проверить запись миграции в своей базе данных и просто использовать условия. Итак, внутри вашей задачи rake, если флаг ‹ 1, запустите первый шаг миграции, затем обновите флаг до 1. Если флаг ‹ 2, запустите шаг 2 миграции и обновите флаг до 2 и т. д. - person cpjolicoeur; 27.03.2012

Даже если вы не вносите изменения в схему, вам может потребоваться переместить данные между полями или удалить поля, которые больше не используются в кодовой базе. Хорошо иметь миграции, которые можно запускать при развертывании нового кода. Я рекомендую использовать гем под названием mongoid_rails_migrations. Это предоставляет вам генераторы миграции, к которым вы привыкли, и обеспечивает некоторую организацию миграции данных.

class MyMigration < Mongoid::Migration

  def self.up
    MyModel.all.each do |model|
      # label was renamed to name
      model.set :name, model[:label] # copy the data from the old field to the new one
      model.remove_attribute :label # remove the old field from the document
      model.save!
    end
  end

end
person Andrew    schedule 26.06.2013
comment
Просто на заметку, встроенный способ сделать это — MyModel.all.rename(label: :name). Это выполняет атомарное $rename и даст вам гораздо лучшую производительность, чем ручное пошаговое выполнение и сохранение. +1 за mongoid_rails_migrations :) - person Jay; 20.05.2015

Этот вопрос касается той же проблемы создания пользовательских миграций в настройке mongoid.

Модель изменения времени выполнения с mongodb/mongoid

person Alexis Perrier    schedule 28.03.2012

Недавно у меня был какой-то сценарий, когда мне нужно было выполнить миграцию данных только один раз (в основном обновить грязные данные); Итак, у меня были монгоидные миграции в /db/migrate/ и переопределение задачи db:migrate, чтобы она создавала коллекцию в mongo db самого приложения, скажем, «миграции», которые записывают миграцию, которая была запущена, с этим , ни одна из миграций не будет выполняться снова, и вы можете продолжать добавлять миграции с некоторой иерархией (если миграция является взаимозависимой).

person Sny    schedule 04.01.2013