Bagaimana Rails melacak migrasi mana yang telah berjalan untuk database?

93

Menurut dokumen Rails: http://guides.rubyonrails.org/migrations.html

"Trek Rekaman Aktif yang migrasinya telah dijalankan sehingga yang harus Anda lakukan hanyalah memperbarui sumber Anda dan menjalankan rake db: migrate."

Bagaimana sebenarnya ActiveRecord melakukan ini? Di mana Rekaman Aktif menyimpan datanya?

Saya menduga ini mungkin disimpan dalam database itu sendiri? Di meja di suatu tempat.

Di mesin pengembangan saya, saya menjalankan semua migrasi. Kemudian saya menyalin database produksi menggunakan mysqldump. Kemudian saya menjalankan "rake db: migrate: status", ini menunjukkan dengan benar migrasi yang perlu dijalankan pada database produksi.

Saya dulu berpikir bahwa ActiveRecord melacak migrasi terakhir yang dijalankan menggunakan stempel waktu. Tetapi saya pikir ini tidak benar karena ActiveRecord dengan benar menjalankan migrasi "lama" yang digabungkan dari cabang kode lain.

Bisakah seseorang dengan pengetahuan orang dalam menjelaskan hal ini? Terima kasih

Zack Xu
sumber
1
Ini memiliki tabel dalam database yang melacak, saya yakin.
Jack Franklin

Jawaban:

166

Rails membuat tabel di database Anda yang dipanggil schema_migrationsuntuk melacak migrasi mana yang telah berjalan.

Tabel berisi satu kolom version,. Saat Rails menjalankan migrasi, ia mengambil digit terdepan dalam nama file migrasi dan menyisipkan baris untuk "versi" tersebut, yang menandakan bahwa migrasi telah dijalankan. Jika Anda mengembalikan migrasi itu, Rails akan menghapus baris terkait dari schema_migrations.

Misalnya, menjalankan file migrasi bernama 20120620193144_create_users.rbakan memasukkan baris baru dengan versi 20120620193144ke dalam schema_migrationstabel.

Anda bebas kapan saja untuk memperkenalkan migrasi dengan versi sebelumnya. Rails akan selalu menjalankan migrasi baru yang tidak memiliki baris terkait schema_migrations. Digit terdepan tidak harus berupa stempel waktu, Anda dapat memanggil migrasi Anda 001_blah.rb. Versi Rails yang lebih lama menggunakan format ini, dan menggunakan penomoran berurutan untuk migrasi yang baru dibuat. Versi yang lebih baru telah beralih ke stempel waktu untuk membantu mencegah beberapa pengembang membuat migrasi secara mandiri dengan nomor yang sama.

meagar
sumber
Sangat berguna ketika Anda menggunakan campuran mesin yang dapat dipasang dan aplikasi tiruan
Donato