Zarządzanie migracjami mongoid

Czy ktoś może mi dać krótkie wprowadzenie do robienia migracji DB w Rails przy użyciu Mongoid? Szczególnie interesują mnie leniwe migracje dokumentów. Mam na myśli to, że za każdym razem, gdy czytasz dokument z bazy danych, migrujesz go do najnowszej wersji i zapisujesz ponownie.

Czy ktoś już robił takie rzeczy? Natknąłem się na mongoid_rails_migrations, ale nie dostarcza żadnej dokumentacji i chociaż wygląda na to, że to robi, nie jestem naprawdę jasne, jak go używać.

Powinienem zaznaczyć, że jestem tylko koncepcyjnie zaznajomiony z migracjami ActiveRecord.

Author: Paul Biggar, 2011-12-20

3 answers

Jeśli chcesz wykonać całą migrację na raz, mongoid_rails_migrations zrobi to, czego potrzebujesz. Nie ma zbyt wiele do udokumentowania, duplikuje funkcjonalność standardowej migracji ActiveRecord. Piszesz swoje Migracje, a następnie używasz rake db:migrate do ich zastosowania i zajmuje się ustalaniem, które z nich zostały i nie zostały uruchomione. Mogę odpowiedzieć na dalsze pytania, jeśli jest coś konkretnego, co chcesz wiedzieć na ten temat.

W przypadku leniwych migracji najprostszym rozwiązaniem jest użycie wywołanie zwrotne after_initialize. Sprawdź, czy pole pasuje do starego schematu danych, a jeśli to zrobi, zmodyfikuj obiekt i zaktualizuj go, tak na przykład:

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

Kompromisy, aby pamiętać o konkretnym podejściu, które podałem powyżej:

Jeśli uruchomisz żądanie, które zwraca wiele rekordów, takich jak Person.all.each {|p| puts p.name} i 100 osób ma stary format, natychmiast uruchomi ono 100 zestawów zapytań. Możesz również wywołać self.name = "#{self.first_name} #{self.last_name}".strip zamiast tego, ale oznacza to, że Twoje dane będą migrowane tylko wtedy, gdy rekord jest uratowany.

Ogólne Problemy, które możesz mieć, to to, że wszelkie zapytania masowe, takie jak Person.where(:name => /Foo/).count nie powiedzie się, dopóki wszystkie dane nie zostaną przeniesione. Również jeśli wykonasz Person.only(:name).first migracja nie powiedzie się, ponieważ zapomnisz dołączyć Pola first_name i 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/doraprojects.net/template/agent.layouts/content.php on line 54
2011-12-26 17:16:12

Zachary Anker wiele wyjaśnił w swojej odpowiedzi.korzystanie z mongoid_rails_migrations jest dobrym rozwiązaniem dla migracji.

Oto kilka linków z przykładami, które będą przydatne dla ciebie, aby przejść i użyć mongoid_rails_migrations

Migracje Mongoid przy użyciu sterownika Mongo

Osadzanie dokumentów Mongoid i migracje danych

Inne to Readme powinno wystarczyć w tym przykładzie, aby zaimplementować mongoid migracja

 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/doraprojects.net/template/agent.layouts/content.php on line 54
2015-06-25 18:31:05

Mam taką samą potrzebę.

Oto co wymyśliłem: https://github.com/nviennot/mongoid_lazy_migration

Chętnie będę wdzięczny za opinie

 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/doraprojects.net/template/agent.layouts/content.php on line 54
2012-07-09 02:52:07