移行全体を一度に実行したい場合は、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
フィールドを含むことを忘れたため、移行が失敗します。
いくつかのフィードバックをいただければ幸いですhttps://github.com/nviennot/mongoid_lazy_migration
:ここ
は私が思いついたものです。私はむしろ大規模なデータ更新を実行し、それが完了し、監視し、何かがうまくいかない場合に元に戻す方法を考え、データベースのクローンで最初にテストする時間を取ることにします。時間がかかりますが、データが矛盾することはありません。 –