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.

Author: Paul Biggar, 2011-12-20

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.

 22
Author: Zachary Anker,
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

 7
Author: PriteshJ,
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

 3
Author: Nicolas Viennot,
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