Monday, April 14, 2008

new migration

ตอนนี้ใน edge rails ได้มีการปรับปรุง migration แล้ว
จากของเดิมที่ 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

Related link from Roti