Według dokumentu Rails: http://guides.rubyonrails.org/migrations.html
„Moduł Active Record śledzi, które migracje zostały już uruchomione, więc wszystko, co musisz zrobić, to zaktualizować źródło i uruchomić rake db: migrate”.
Jak właściwie to robi ActiveRecord? Gdzie Active Record przechowuje dane?
Podejrzewam, że to może być zapisane w samej bazie danych? Gdzieś w stole.
Na moim komputerze programistycznym przeprowadziłem wszystkie migracje. Następnie skopiowałem produkcyjną bazę danych za pomocą mysqldump. Następnie uruchomiłem "rake db: migrate: status", który poprawnie pokazuje migracje, które należy uruchomić na produkcyjnej bazie danych.
Kiedyś myślałem, że ActiveRecord śledzi ostatni przebieg migracji przy użyciu znacznika czasu. Ale myślę, że to nieprawda, ponieważ ActiveRecord poprawnie uruchamia „starsze” migracje scalone z innej gałęzi kodu.
Czy mógłby ktoś z wewnętrzną wiedzą na ten temat? Dzięki
źródło
Odpowiedzi:
Railsy tworzą w Twojej bazie danych tabelę o nazwie
schema_migrations
aby śledzić, które migracje zostały uruchomione.Tabela zawiera pojedynczą kolumnę
version
. Kiedy Railsy uruchamiają migrację, pobiera pierwsze cyfry w nazwie pliku migracji i wstawia wiersz dla tej „wersji”, wskazując, że została uruchomiona. Jeśli cofniesz migrację, Railsy usuną odpowiedni wiersz zschema_migrations
.Na przykład uruchomienie pliku migracji o nazwie
20120620193144_create_users.rb
spowoduje wstawienie20120620193144
doschema_migrations
tabeli nowego wiersza z wersją programu .W dowolnym momencie możesz wprowadzić migracje we wcześniejszych wersjach. Railsy zawsze będą uruchamiać nowe migracje, dla których nie ma odpowiedniego wiersza
schema_migrations
. Początkowe cyfry nie muszą być sygnaturą czasową, możesz nazwać migrację001_blah.rb
. Wcześniejsze wersje Railsów używały tego formatu i używały numeracji sekwencyjnej dla nowo generowanych migracji. Późniejsze wersje przeszły na sygnatury czasowe, aby uniemożliwić wielu programistom niezależne generowanie migracji o tym samym numerze.źródło