2011-12-20 12 views
25

Mongoidを使ってRailsでDBマイグレーションを行う方法について簡単に紹介してもらえますか?私は特にドキュメントごとの移行に怠惰に興味があります。これは、データベースからドキュメントを読み込むたびに、そのドキュメントを最新のバージョンに移行して再度保存するということです。モンゴイのマイグレーションを管理する

誰もこの種のことを以前にしたことがありますか?私はmongoid_rails_migrationsに出くわしましたが、それはどんな種類のドキュメントも提供していませんが、これを行うように見えますが、どのように使用するのか分かりません。

私は、概念的にActiveRecordの移行に精通していることを指摘しておきます。

+0

いくつかのフィードバックをいただければ幸いですhttps://github.com/nviennot/mongoid_lazy_migration

:ここ

は私が思いついたものです。私はむしろ大規模なデータ更新を実行し、それが完了し、監視し、何かがうまくいかない場合に元に戻す方法を考え、データベースのクローンで最初にテストする時間を取ることにします。時間がかかりますが、データが矛盾することはありません。 –

答えて

21

移行全体を一度に実行したい場合は、mongoid_rails_migrationsが必要な処理を行います。文書化することはあまりありません。標準のActiveRecord移行の機能を複製します。あなたはあなたのマイグレーションを書いて、次にそれを適用するためにrake db:migrateを使い、実行されたものと実行されていないものを計算します。あなたがそれについて知りたいと思う何かがあるなら、私はさらに質問に答えることができます。

遅延移行の場合、最も簡単な解決策は、after_initializeコールバックを使用することです。フィールドは、古いデータ・スキームに一致するかどうかをチェックし、それがない場合、たとえばので、あなたは、それをそれにオブジェクトを変更し、更新します。

class Person 
    include Mongoid::Document 

    after_initialize :migrate_data 

    field :name, :type => String 

    def migrate_data 
     if !self[:first_name].blank? or !self[:last_name].blank? 
      self.set(:name, "#{self[:first_name]} #{self[:last_name]}".strip) 
      self.remove_attribute(:first_name) 
      self.remove_attribute(:last_name) 
     end 
    end 
end 

トレードオフは、私が上記与えた具体的なアプローチに心に留めておくために:

Person.all.each {|p| puts p.name}などの多くのレコードを返す要求を実行し、100人が古い形式を使用すると、すぐに100個のクエリが実行されます。代わりにself.name = "#{self.first_name} #{self.last_name}".stripと電話することもできますが、これは、レコードが保存される場合にのみデータが移行されることを意味します。

一般的な問題は、すべてのデータが移行されるまで、Person.where(:name => /Foo/).countなどの大量クエリが失敗することです。また、Person.only(:name).firstを実行すると、first_nameフィールドとlast_nameフィールドを含むことを忘れたため、移行が失敗します。

7

Zachary Ankerは彼の答えに多くのことを説明しています。mongoid_rails_migrationsを使用すると、移行に適したオプションです。ここで

は、あなたが通過し、この Readmeは、この例で十分なはずですが実装する mongoid_rails_migrations

Mongoid Migrations using the Mongo Driver

Embedding Mongoid documents and data migrations

その他を使用するために有用であろう例といくつかのリンクですモンゴイの移動

3

私は同じ必要があります。私は喜んで、私は怠惰な移行は良いアイデアだと思いません

+0

これはちょうどいいもの、素晴らしいもののように見えます! –

関連する問題