La gestión de mongoid migraciones
¿Puede alguien darme una breve introducción a la migración de bases de datos en Rails usando Mongoid? Estoy particularmente interesado en las migraciones perezosas por documento. Con esto, quiero decir que cada vez que lee un documento de la base de datos, lo migra a su última versión y lo guarda de nuevo.
Alguien Ha hecho este tipo de cosas antes? Me he encontrado con mongoid_rails_migrations, pero no proporciona ningún tipo de documentación, y aunque parece que lo hace, realmente no estoy seguro de cómo usarlo.
Debo señalar que solo estoy familiarizado conceptualmente con las migraciones de ActiveRecord.
3 answers
Si desea realizar toda la migración a la vez, mongoid_rails_migrations hará lo que necesite. No hay mucho que documentar, duplica la funcionalidad de la migración estándar de ActiveRecord. Escribes tus migraciones, y luego usas rake db:migrate
para aplicarlas y se encarga de averiguar cuáles se han ejecutado y cuáles no. Puedo responder más preguntas si hay algo específico que quieras saber al respecto.
Para migraciones perezosas, la solución más fácil es usar la devolución de llamada after_initialize . Compruebe si un campo coincide con el esquema de datos anterior, y si lo hace, modifique el objeto y actualice, por ejemplo:
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
Las compensaciones a tener en cuenta con el enfoque específico que di anteriormente:
Si ejecuta una solicitud que devuelve muchos registros, como Person.all.each {|p| puts p.name}
y 100 personas tienen el formato antiguo, ejecutará inmediatamente 100 consultas de conjunto. También puede llamar a self.name = "#{self.first_name} #{self.last_name}".strip
en su lugar, pero eso significa que sus datos solo se migrarán si el registro se salva.
Los problemas generales que puede tener es que cualquier consulta masiva como Person.where(:name => /Foo/).count
fallará hasta que todos los datos se migren. También si lo hace Person.only(:name).first
la migración fallaría porque olvidó incluir los campos first_name
y last_name
.
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2011-12-26 17:16:12
Zachary Anker ha explicado mucho en su respuesta.el uso de mongoid_rails_migrations es una buena opción para la migración.
Aquí hay algunos enlaces con ejemplo que serán útiles para que usted pueda ir a través y utilizar mongoid_rails_migrations
Migraciones mongoides usando el controlador Mongo
Incrustación de documentos mongoides y migraciones de datos
Otro que este el Readme es debería ser suficiente con este ejemplo para implementar mongoid migración
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2015-06-25 18:31:05
Tengo la misma necesidad.
Esto es lo que se me ocurrió: https://github.com/nviennot/mongoid_lazy_migration
Con mucho gusto apreciaría algunos comentarios
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2012-07-09 02:52:07