Como o Rails mantém o controle de quais migrações foram executadas para um banco de dados?

93

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

Zack Xu
fonte
1
Tem uma tabela no banco de dados que mantém o controle, eu acredito.
Jack Franklin de

Respostas:

166

O Rails cria uma tabela em seu banco de dados chamada schema_migrationspara 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 de schema_migrations.

Por exemplo, a execução de um arquivo de migração chamado 20120620193144_create_users.rbirá inserir uma nova linha com uma versão de 20120620193144na schema_migrationstabela.

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ção 001_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.

meagar
fonte
Especialmente útil quando você está usando uma mistura de um motor montável e um aplicativo fictício
Donato