Obecně by mělo být možné aktualizovat staré dokumenty novými poli za běhu. V MongoDB není potřeba migrace.
Možná budete chtít napsat úlohy rake, abyste aktualizovali své staré dokumenty pomocí nových polí a výchozích hodnot.
Tyto dokumenty můžete zjistit kontrolou těch nových polí, která mají standardně nulovou hodnotu.
Aktualizovat
Snadný styl:
Pokud definujete nové pole s výchozí hodnotou, měla by se tato hodnota vždy používat, pokud nastavíte novou:
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
Pokud zadáte dotaz do databáze, měli byste získat výchozí hodnotu pro dokumenty, které toto pole nemají před vaším rozšířením:
(konzola kolejnic)
MyModel.first
#=> #<MyModel …other fields…, note: "no note given so far!">
Testoval jsem to s čerstvým stackem rails s aktuálním mongoidem na Ruby 1.9.2 - mělo by to fungovat i s jinými stacky.
Složitější/složitější styl:
Pokud jste nenastavili výchozí hodnotu, dostanete pro toto nové pole nulu.
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
(konzola kolejnic)
MyModel.first
#=> #<MyModel …other fields…, note: nil>
Pak byste mohli nastavit úlohu rake a migrační soubor jako v tomto příkladu:
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
Spusťte tuto migraci pomocí rake mymodel:migrate
.
Toto je pouze výchozí bod a můžete jej rozšířit na úplný migrační motor mongoidů.
task :migrate => :environment do …
je nutné, jinak rake nenačte modely.