一般に、実行時に古いドキュメントを新しいフィールドで更新できるはずです。 MongoDBで移行する必要はありません。
古いドキュメントを新しいフィールドとデフォルト値で更新するrakeタスクを作成することをお勧めします。
これらのドキュメントは、デフォルトでnil値を持つ新しいフィールドをチェックすることで見つけることができます。
更新
簡単なスタイル:
デフォルト値で新しいフィールドを定義する場合、新しいフィールドを設定する限り、この値を常に使用する必要があります。
app / models / my_model.rb
class MyModel
include Mongoid::Document
field :name, type: String
field :data, type: String
# NEW FIELD
field :note, type: String, default: "no note given so far!"
end
データベースにクエリを実行する場合は、拡張機能の前にこのフィールドがないドキュメントのデフォルト値を取得する必要があります。
(rails console)
MyModel.first
#=> #<MyModel …other fields…, note: "no note given so far!">
これを、Ruby1.9.2の現在のモンゴイドを使用した新しいレールスタックでテストしました。他のスタックでも機能するはずです。
より複雑/複雑なスタイル:
デフォルト値を設定しなかった場合、この新しいフィールドにはnilが表示されます。
app / models / my_model.rb
class MyModel
include Mongoid::Document
field :name, type: String
field :data, type: String
# NEW FIELD
field :note, type: String
end
(rails console)
MyModel.first
#=> #<MyModel …other fields…, note: nil>
次に、次の例のようにrakeタスクと移行ファイルを設定できます。
lib / tasks / my_model_migration.rake:
namespace :mymodel do
desc "MyModel migration task"
task :migrate => :environment do
require "./db/migrate.rb"
end
end
db / migrate.rb:
olds = MyModel.where(note: nil)
# Enumerator of documents without a valid :note field (= nil)
olds.each do |doc|
doc.note = "(migration) no note given yet"
# or whatever your desired default value should be
doc.save! rescue puts "Could not modify doc #{doc.id}/#{doc.name}"
# the rescue is only a failsafe statement if something goes wrong
end
rake mymodel:migrate
を使用してこの移行を実行します 。
これは出発点にすぎず、これを完全なモンゴイド移行エンジンに拡張できます。
task :migrate => :environment do …
そうしないと、rakeはモデルをロードしません。