วันพฤหัสบดี, มิถุนายน 21, 2550

อ่าน Agile Web Development with Rails ( 3 )

ตอนที่แล้วทำให้เห็นภาพของสององค์ประกอบหลักในสถาปัตยกรรม MVC ใน Rails ยังขาดอยู่อีกตัวหนึ่งคือ M - Model ซึ่งเราจะได้เห็นกันในระหว่างการทดลองสร้าง application ตัวอย่างที่ชื่อ depot นี้ครับ

Rails รองรับการใช้งานฐานข้อมูลหลายตัว เราสามารถกำหนดได้ว่าจะใช้ตัวไหนตั้งแต่ตอนสร้าง application เช่น
rails app_name --database=oracle
หากไม่กำหนดดังนี้ rails จะเลือกใช้ค่า default คือ mysql ครับ

นอกจากนี้เรายังสามารถแก้ไขโดยตรงในไฟล์ config/database.yml พร้อมกับการกำหนดชื่อฐานข้อมูล และ username/password ก็ได้
Rails ไม่ได้บังคับเรื่องชื่อของฐานข้อมูลที่ใช้ แต่ตามข้อตกลงแล้ว ควรจะเป็นชื่อเดียวกับ application_*
เช่น application ชื่อ depot ฐานข้อมูลที่ใช้ระหว่างพัฒนาก็ควรเป็น depot_development

เมื่อกำหนดข้อมูลใน config/database.yml แล้ว สามารถทดสอบ config ได้โดย
rake db:migrate
เจ้า rake นี่ก็คือ make ของ ruby นั่นเองครับ

อ้อ... อย่าลืม create database และ user พร้อมกำหนดสิทธิ์ให้เรียบร้อยก่อน rake นะครับ ไม่งั้นไม่ผ่านแน่ๆครับ

เอาเป็นว่าตอนนี้เราสร้าง app ชื่อ depot และอยู่ใน working directory แล้ว โดยมีฐานข้อมูลพร้อมแล้วด้วยนะครับ

ทีนี้ก็กำหนด data model สำหรับสินค้าใน depot ชื่อโมเดล (และตาราง) คือ product ครับ
ruby script/generate model product
จะได้ไฟล์มากองนึง แต่ที่น่าสนใจมี 2 ไฟล์คือ app/models/product.rb และ db/migrate/001_create_products.rb (โปรดสังเกตว่าอันหลังมี s แถมท้ายชื่อ model มาให้ด้วย)

ไฟล์ app/models/product.rb คือตัว model ซึ่งเราจะมาดูทีหลังครับ
ตอนนี้ดูที่ db/migrate/001_create_products.rb กันก่อน เราจะแก้ไขไฟล์นี้ให้เป็นอย่างนี้ครับ

class CreateProducts < ActiveRecord::Migration
def self.up
create_table :products do |t|
t.column :title, :string
t.column :description, :text
t.column :image_url, :string
end
end

def self.down
drop_table :products
end
end

method ชื่อ up จะถูกเรียกให้ทำงานเมื่อเราสั่ง rake db:migrate
จะจัดการสร้าง table ชื่อ productsให้เราครับ

วิธีนี้ทำให้การพัฒนา application สะดวกขึ้น เพราะสามารถควบคุม version ได้
กรณีนี้ ถ้าเรียก rake db:migrate -VERSION=0 เจ้า method ชื่อ down ก็จะถูกเรียก tabel ชื่อ products ก็จะหายไป
การ rake db:migrate โดยไม่ระบุ VERSION ก็จะสร้าง VERSION ปัจจุบัน ทั้งนี้ Rails จะรู้ได้ว่า VERSION ในฐานข้อมูลคือ VERSION ไหนได้โดยสร้าง table ชื่อ schema info มาเก็บค่า VERSION ไว้ครับ

ทีนี้มาสร้าง controller ที่ใช้จัดการ products
ruby script/generate controller admin
เช่นเดิม เราจะสนใจเฉพาะ app/controllers/admin_controller.rb โดยเข้าไปเพิ่มเพียงหนึ่งบรรทัดให้เป็นอย่างนี้
class AdminController < ApplicationController
scaffold :product
end
คำสั่ง scaffold ใช้กำหนดให้ Rails สร้างโค้ดสำหรับจัดการ ข้อมูลใน model product ระหว่าง runtime

ไม่เชื่อก็ต้องเชื่อ เรียก http://host_name/admin จะเห็นได้ว่าเราสามารถจัดการกับข้อมูลใน product ได้แล้ว ทั้ง add, edit, remove ได้หมดเลย

คำสั่งเดียวแท้ๆ

ไม่มีความคิดเห็น: