1

私は現在、mongoid/mongoDBをバックエンドで使用しているレールアプリを開発中です。私はスキーマを移行するためにActiveRecordのような移行は必要ないと理解していますが、モンゴイドモデルの定義を変更するとデータを移行する必要があります。そこにいる誰もが同じシナリオを実行していますか?もしそうなら、あなたはそれをどのように扱っていますか?Rails/Mongoidデータベースの移行

+2

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

答えて

2

が必要

+0

ありがとう。私はそれを考えていましたが、私はこれを一度実行する必要があります。 –

+1

私は従いません。レーキタスクは、1回または何回でも簡単に実行できます。一度実行してからタスクを削除してください。 – cpjolicoeur

+0

私はそれが一度実行され、その後、そのレコードがデータベースにとどまっている限り、再び実行されないように実行されたある種のレコードを持っています。しかし、いったんコードを実行すると、コードを削除するだけのことは考えていませんでした。 –

0

としてデータを移行するためのカスタムrakeタスクを書くこの質問はmongoidセットアップでカスタム移行を作成するのと同じ問題を解決します。

Runtime changing model with mongodb/mongoid

0

私は一度だけ、いくつかのデータ移行を行う必要があり、最近いくつかのシナリオを、(基本的にはダーティデータを更新)持っていました。 だから私は/ db/migrate /にmongoidの移行を行い、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)'です。これはアトミックな$リネームを実行し、手動で実行して保存するよりはるかに優れたパフォーマンスを提供します。 'mongoid_rails_migrations'の+1 – Jay

関連する問題