Wednesday, March 30, 2005

Ruby on Rails #2

ลองมาดูที่ Object Relation Mapping ก่อน
ตัว ruby on rails ใช้ Active Record

ลองดูหลักการเบื้องต้นก่อน
  • การ map เข้ากับ table
    ใช้หลักง่ายๆก็คือ ชื่อ class ในรูปเอกพจน์ map กับ ชื่อ table ในรุปพหูพจน์
    class Person < ActiveRecord::Base
    end
    class person map เข้ากับ table persons
    และ column ทุก column ใน table persons
    automatic map เป็น property ของ class Person
    Note: จะเห็นได้ว่าตัว class person ต้อง extend base class ที่ชื่อ ActiveRecord
  • การ map Relationship
    class Project < ActiveRecord::Base
    belongs_to :portfolio
    has_one :project_manager
    has_many :milestones
    has_and_belongs_to_many :categories
    end
    • belongs_to เป็นได้ทั้ง many-to-one หรือ one-to-one
      โดย primary key ของ portfolios => foreign key ของ Projects
    • has_one มีลักษณะเป็น one-to-one
      โดย primary key ของ project => foreign key ของ project_managers
    • has_many เป็น one-to-many
    • has_and_belongs_to_many เป็น many-to-many โดยต้องมี table
      หนึ่งสำหรับเก็บ pk ของทั้ง categories และ projects
      โดย default table name จะใช้ชื่อว่า categories_projects (เรียงตามลำดับอักษร)
  • Aggregate Mapping (hibernate เรียก component mapping)
    เป็นการ map attribute ตัวเดียวหรือหลายๆตัวเป็น object
    class Customer < ActiveRecord::Base
    composed_of :balance, :class_name => "Money", :mapping => %w(balance amount)
    composed_of :address, :mapping => [ %w(address_street street), %w(address_city city) ]
    end
    • customer.balance จะมี datatype เป็น Money
      โดย attribute ที่ชื่อ balance จะถูก pass เป็น
      parameter ที่ชื่อ amount ใน Money Constructor Method
    • ส่วน customer.address จะมี datatype เป็น Address
      โดยใช้ attribute address_street, address_citry
      ในการ initialize Address object

  • Validation
    class Account < ActiveRecord::Base
    validates_presence_of :subdomain, :name, :email_address, :password
    validates_uniqueness_of :subdomain
    validates_acceptance_of :terms_of_service, :on => :create
    validates_confirmation_of :password, :email_address, :on => :create
    end
    • presence_of -> Require
    • uniqueness_of -> ค่าที่ set ต้อง unique ใน table
    • acceptance_of -> case พิสดารหน่อย ไม่มีการเก็บลง table จริง
      แต่ต้องการให้มีการ pass ค่ามา
      (เห็นเขายกตัวอย่าง use case กรณี หน้าจอที่ต้อง tick accept license)
    • confirmation_of ->case พิสดารเช่นกัน เขายกตัวอย่างพวก password
      confirmation ที่ค่า 2 ค่าต้องตรงกัน
  • Self Relate RelationShip (พวกที่ structure เป็น tree)
    class Item < ActiveRecord::Base
    belongs_to :list
    acts_as_list :scope => :list
    end

  • Etc. -> Callback, Observers, Inheritance, Transaction

จะเห็นได้ว่า Powerfull เหลือเฟือเหลือใช้
เป็นทางเลือกอีกทางที่น่าสนใจ

Related link from Roti

No comments: