Monday, December 05, 2005

Rails Migrations

เคยเขียนเรื่อง Migration ของ RoR ไปทีหนึ่ง
ในเรื่อง ทดลอง acts_as_tree feature ของ ActiveRecord (Ruby on Rails)
วันนี้เห็น link tutorial ที่เข้าใจง่ายดี
ก็เลยเอามาลงให้ดูกัน
The Joy of Migrations

ประโยคคำสั่งที่เราสามารถใช้ใน Migration class ก็มี
  • create_table
    syntax ของ create_table ก็คือ
    create_table :test do |t|
    t.column :col0, :string
    t.column :col1, :text
    t.column :col2, :integer
    t.column :col3, :float
    t.column :col4, :datetime
    t.column :col5, :timestamp
    t.column :col6, :time
    t.column :col7, :date
    t.column :col8, :binary
    t.column :col9, :boolean
    t.column :col10, :int2
    end

    ตั้งแต่ col0 -> col9 เป็น datatype ที่ ActiveRecord define ไว้แล้ว
    ซึ่งมันจะทำการแปลงเป็น datatype จริงๆให้อีกที
    โดยขึ้นอยู่กับ Database ที่เราเลือกใช้
    ส่วนกรณี col10 เป็น datatype ที่ ActiveRecord ไม่ได้ define ไว้
    เวลา generate sql ActiveRecord ก็จะ generate ออกไปตามที่เราพิมพ์เลย

    sql ที่ได้จากข้างบน จะหน้าตาดังนี้
     CREATE TABLE test ("id" serial primary key,
    "col0" character varying(255),
    "col1" text,
    "col2" integer,
    "col3" float,
    "col4" timestamp,
    "col5" timestamp,
    "col6" time,
    "col7" date,
    "col8" bytea,
    "col9" boolean,
    "col10" bigint)


    กรณีที่เป็น varchar เราสามารถกำหนด length ได้แบบนี้
      t.column :name, :string, :limit=>25


    กรณีที่ต้องการกำหนด null, default ก็เขียนดังนี้
      t.column :col11, :string, :limit=>25, :default=>"blank", :null=>false

    ซึ่งจะได้ออกมาดังนี้
     "col11" character varying(25) DEFAULT 'blank' NOT NULL)


    รายละเอียดปลีกย่อยของ create_table ยังมีอีกจำนวนหนึ่ง
    ให้ลองดูใน RDoc ของ activeRecord ดู
  • drop_table
    อันนี้ชัดเจน ใช้ drop table
  • add_column
    format ของ add_column เหมือนตอนที่เราเขียน t.column
  • remove_column
    อันนี้ชัดเจน ไม่ต้องอธิบาย
  • rename_table
  • rename_column
  • change_column
    เปลี่ยน definition ของ column
  • change_column_default
  • add_index
    ตัวอย่าง
    add_index(:accounts, [:branch_id, :party_id], :unique => true)

  • remove_index

Related link from Roti

No comments: