De acordo com o documento Rails: http://guides.rubyonrails.org/migrations.html
"O Active Record rastreia quais migrações já foram executadas, então tudo que você precisa fazer é atualizar sua fonte e executar rake db: migrate."
Como o ActiveRecord realmente faz isso? Onde o Active Record armazena os dados?
Eu suspeito que isso pode estar armazenado no próprio banco de dados. Em uma mesa em algum lugar.
Em minha máquina de desenvolvimento, executei todas as migrações. Então copiei o banco de dados de produção usando o mysqldump. Então executei o "rake db: migrate: status", ele mostra corretamente as migrações que precisam ser executadas no banco de dados de produção.
Eu costumava pensar que o ActiveRecord rastreia a última migração executada usando o carimbo de data / hora. Mas acho que isso não é verdade porque o ActiveRecord executa corretamente as migrações "mais antigas" mescladas de outro branch de código.
Alguém com conhecimento interno sobre isso poderia elaborar? obrigado
fonte
Respostas:
O Rails cria uma tabela em seu banco de dados chamada
schema_migrations
para controlar quais migrações foram executadas.A tabela contém uma única coluna
version
,. Quando o Rails executa uma migração, ele pega os dígitos iniciais do nome do arquivo de migração e insere uma linha para aquela "versão", indicando que ela foi executada. Se você reverter essa migração, o Rails irá deletar a linha correspondente deschema_migrations
.Por exemplo, a execução de um arquivo de migração chamado
20120620193144_create_users.rb
irá inserir uma nova linha com uma versão de20120620193144
naschema_migrations
tabela.Você está livre a qualquer momento para introduzir migrações com versões anteriores. O Rails sempre executará qualquer nova migração para a qual não haja uma linha correspondente em
schema_migrations
. Os dígitos iniciais não precisam ser um carimbo de data / hora, você pode chamar sua migração001_blah.rb
. Versões anteriores do Rails usavam este formato, e usavam numeração sequencial para migrações recém-geradas. Versões posteriores mudaram para carimbos de data / hora para ajudar a evitar que vários desenvolvedores gerem migrações independentemente com o mesmo número.fonte