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
sumber
Jawaban:
Rails membuat tabel di database Anda yang dipanggil
schema_migrations
untuk 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 darischema_migrations
.Misalnya, menjalankan file migrasi bernama
20120620193144_create_users.rb
akan memasukkan baris baru dengan versi20120620193144
ke dalamschema_migrations
tabel.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 Anda001_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.sumber