จากของเดิมที่ migration จะใช้ เลข running version 1,2,3,...
ไปเป็น utc timestamp แทน เพื่อแก้ปัญหากรณี branch 2 branch ต่างคนต่างสร้าง migration ทำให้เลข version ชนกัน
สำหรับผมถือเป็นการปรับปรุงที่สำคัญมาก
เนื่องจากมันเป็นปัญหาที่กวนใจผมมานานมากแล้ว
ลองดูตัวอย่าง file ที่
script/generate migration
สร้างให้
pphetra@mypann:~/projects/ruby/mg$ ls db/migrate/
20080414002052_create_users.rb 20080414002059_create_posts.rb
นอกจากนี้ยังได้เปลี่ยนแปลง table ที่ทำหน้าที่เก็บข้อมูล version
จาก schema_info ไปเป็น schema_migrations
โดยจะเปลี่ยนวิธีการเก็บ จากเดิมที่เก็บเฉพาะเลข current version
ไปเป็น เก็บทุก version ที่มีการ apply แล้ว
sqlite> select * from schema_migrations
...> ;
20080414002052
20080414002059
สุดท้ายก็คือมีการเพิ่ม rake task เข้ามาใหม่คือ
rake db:migrate:up
กับrake db:migrate:down
โดย algorithm ที่ใช้ จะไม่เหมือนเดิม
จากเดิมเป็นการไล่เลข running ขึ้นลงเพียงอย่างเดียว
ไปเป็นการไล่ตรวจสอบด้วยว่า มีการ apply migration version นั้นๆแล้วหรือยัง
(เขาใช้ศัพท์เรียก migration พวกที่ยังไม่ apply ว่า interleaved migration)
ยกตัวอย่างการสั่ง up
ถ้าไล่แบบเดิม มันจะไล่ apply ตั้งแต่ current version + 1 ไปจน ล่าสุด (หรือถึง VERSION ที่ระบุ)
แต่ถ้าเป็นของใหม่ มันจะตรวจว่า มี migration อันไหนที่ยังไม่ apply บ้างแล้วจัดการ apply ให้เรา
กรณี down ก็เช่นกัน
ถ้ามันตรวจพบว่ามี migration ไหน ยังไม่ apply มันก็จะ skip migration นั้นๆให้
Links