1

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

+2

https://github.com/adacosta/mongoid_rails_migrations – rubish

ответ

2

Написать задание пользовательских рейк для переноса данных по мере необходимости

+0

Спасибо. Я подумал об этом, но мне нужно, чтобы это запускалось один раз. –

+1

Я не следую. Вы можете легко запустить задачу рейка один или несколько раз, как вы хотите. Запустите его один раз, а затем удалите задачу. – cpjolicoeur

+0

Итак, я хочу, чтобы он запускался один раз, а затем имел какую-то запись, которая была запущена, поэтому она никогда не будет запущена снова, пока эта запись останется в базе данных. Однако я не думал просто удалять код после его запуска. –

0

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

6

Даже если вы не изменяете схему, вам может потребоваться переместить данные между полями или удалить поля, которые больше не используются в кодовой базе. Приятно иметь миграцию, которую можно запускать при развертывании нового кода. Я рекомендую использовать драгоценный камень под названием 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 
+1

Просто голова, построенная таким образом, это 'MyModel.all.rename (label:: name)'. Это выполняет атомное переименование $ и даст вам гораздо лучшую производительность, чем ручной переход и сохранение. +1 для 'mongoid_rails_migrations' :) – Jay

Смежные вопросы