สนุกกับ ActiveRecord ภาคเกรลส์

ไปอ่าน สนุกกับ ActiveRecord เบื้องต้น ของ อ. มะนาว (@jittat) ที่ rails66 มาครับ เลยนึกขึ้นได้ว่าน่าจะกลับมาเขียน content แบบเริ่มต้นบ้าง

เพื่อให้เป็นไปในลักษณะเดียวกัน ผมขออนุญาตเอาเอนทรีของ @jittat มาแปลงจาก Rails เป็น เกรลส์ จะได้เปรียบเทียบ feature กันแบบ 1:1 ได้

ActiveRecord pattern ในเกรลส์อย่างที่พูดไว้ใน Quickpod ตอนที่ 5 ครับว่าเกรลส์ใช้ความสามารถของภาษา Groovy เพื่อทำให้มัน dynamic ในหลาย ๆ จุด

ก่อนอื่นก็สร้าง application กันก่อนด้วย


$ grails create-app bookstore
$ cd bookstore

แล้วก็เริ่มสร้าง domain class ในเกรลส์ (ใน Rails เรียก model ครับ)

$ grails create-domain-class writer

ก็จะได้ไฟล์ grails-app/domain/Writer.groovy โดยจุดต่างจาก Rails คือในเกรลส์ไม่มีที่ให้ระบุ migration ครับ ความสามารถในการ migrate ทำได้โดยอัตโนมัติผ่าน GORM (ก็ตัวที่จัดการ domain class ให้ในเกรลส์นี่แหละครับ)
และถ้าอยากควบคุมในระดับละเอียดกว่านี้ก็ใช้ปลั๊กอินเช่น LiquiBase ช่วยได้ครับ
[sourcecode]
class Writer {

// ประกาศ property เพิ่มตรงนี้

}
[/sourcecode]
จากนั้นเราก็เพิ่ม property name เป็น String เข้าไปครับ จะได้ตามด้านล่าง
[sourcecode]
class Writer {

String name

}
[/sourcecode]
บางคนอาจจะคุ้นเคยว่านี่เป็นการประกาศ field ในภาษา Java แต่การประกาศลักษณะนี้ (String name) ในภาษา Groovy จะได้

  • private field ชื่อ name เป็น String
  • getter ชื่อ getName
  • setter ชื่อ setName

โดยอัตโนมัติครับ ยกเว้นว่าเราจะประกาศ getName หรือ setName แยกเพิ่มเติมต่างหากเอง

มาดูเรื่อง Database กันหน่อย
เราตั้งค่าการเชื่อมต่อกับฐานข้อมูลได้ในไฟล์ grails-app/conf/DataSource.groovy ครับ ถ้าไม่เปลี่ยนแปลงค่าอะไร เกรลส์ก็จะใช้ HSQLDB แบบ in-memory สำหรับ development mode ครับ (อีก 2 mode คือ test และ production ซึ่งจะอธิบายต่อทีหลังครับ)

ก็คือผมจะทดสอบ domain class Writer เลยโดยใช้ grails console (เหมือนกับ console ใน Rails ครับ)

ผมไม่ได้ลืมสร้าง schema นะครับ ตรงนี้ไม่ต้องเรียกอะไรเพิ่มเติมเพราะเกรลส์จะแปลง domain class เป็น configuration ของ Hibernate แล้วตัว Hibernate ก็จะสร้าง SQL schema ให้อัตโนมัติ

ว่าแล้วก็เริ่มเล่นกันเลยครับ

$ grails console

จะเปิดออกมาเป็นหน้าจอ GUI สำหรับใช้ทดสอบ script

ผมทดลองด้วย
[sourcecode]
import Writer

def w = new Writer()
w.name = “John Goodman”
w.save()
w
[/sourcecode]
(หมายเหตุ บังเอิญว่า Writer ไปตรงกับ java.io.Writer แล้วลำดับการค้นหา class ของ Groovy ให้ความสำคัญกับ package ของ java.* ก่อน เลยทำให้ต้องใส่ import ครับ)

ได้ผลลัพธ์เป็น :

groovy> import Writer
groovy> def w = new Writer()
groovy> w.name = "John Goodman"
groovy> w.save()
groovy> w
Result: Writer : 1

เลข 1 คือข้อมูลจาก property id ซึ่งเป็น 1 ใน สองของ property พิเศษที่เพิ่มเข้าไปใน domain class ของเราครับ
อีกตัวนึงคือ property version ที่เอาไว้เก็บรุ่นของวัตถุ เพื่อใช้จัดการตอนกระบวนการ lock เพื่อบันทึกข้อมูล

ทดสอบกันต่อด้วยการสร้าง Mary ครับ
[sourcecode]
import Writer

def u = new Writer(name: “Mary Prettygood”)
u.save()
[/sourcecode]
ได้ผลลัพธ์เป็น :

groovy> import Writer
groovy> def u = new Writer(name: "Mary Prettygood")
groovy> u.save()

Result: Writer : 2

รอบนี้ใช้ syntax อีกแบบโดยการส่งค่าเป็น Map เข้าไปที่ตัว constructor เลยครับ
สังเกตุว่าคำสั่ง save() นั้นจะคืนค่าเป็น object นะครับ ถ้ามีข้อผิดพลาด ก็จะได้ค่าคืนกลับมาเป็น null แทน ต่างกับ Rails ที่คืนค่าเป็น true เมื่อทำการบันทึกข้อมูลสำเร็จ
แล้วก็มาดูเรื่องการค้นหากันให้

groovy> import Writer
groovy> Writer.findAll()

Result: [Writer : 1, Writer : 2]

findAll() เป็น dynamic method ที่จะคืนค่าเป็น List ครับ
จากนั้นก็จะลองลบ Mary ออกตาม ซึ่งทำได้โดยค้นหา Mary ด้วย id ในที่นี้คือ 2 แล้วก็จัดการลบด้วย delete()

groovy> import Writer
groovy> def mary = Writer.get(2) // ใช้ id เพื่อดึงวัตถุออกมา
groovy> println mary.name // พิมพ์ชื่อออกมาดูให้แน่ใจว่าไม่ลบผิดคน
groovy> mary.delete()
groovy> Writer.findAll()

Mary Prettygood
Result: [Writer : 1]

ในเกรลส์จะใช้ get(id) เพื่อดึงวัตถุออกมาด้วย primary key (ปกติคือค่าของ propery id ถ้าไม่มีการปรับแต่งอะไรเพิ่มเติมครับ)
พอเรา findAll() อีกทีก็จะเหลือ list ที่มี object เดียวอยู่ข้างใน

ก็คงพอจะเห็นภาพนะครับว่าเกรลส์มีจุดต่างกับ Rails อย่างไร ทั้งในแง่ feature, แนวคิด, และชุดคำสั่งครับ

8 thoughts on “สนุกกับ ActiveRecord ภาคเกรลส์

  1. deans4j

    น่าน้อยใจ Seam ไม่มี GORM ให้ใช้ :D

    ของเค้าดีจริง เจ๋งจริงลองสิ

  2. khomkrit

    สนุกจริงๆด้วยครับ :D ตอนนี้กำลังพยายามชวนคนมาสนใจ Grails กันเยอะๆ

  3. cblue Post author

    ถ้าสนใจก็ช่วย port article ของ rails66 คนอื่นมาเป็นเกรลส์ดูครับ

  4. natty

    นี่เก๋สามารถเริ่มต้นเรียน grails จาก post นี้ได้เลยป่ะคะนี่ หรือว่าเริ่มที่ไหนก่อนดี พื้นฐานเคยใช้ ruby on rails มาก่อนนะคะ แนะนำด้วยค่ะ ^_^

  5. Pingback: สนุกกับ Active Record ภาค Grails : ค้น, ค้น, ค้น

Leave a Reply

Your email address will not be published. Required fields are marked *


seven − = 6

You may use these HTML tags and attributes: <a href="" title=""> <abbr title=""> <acronym title=""> <b> <blockquote cite=""> <cite> <code lang=""> <del datetime=""> <em> <i> <q cite=""> <strike> <strong> <pre lang="" extra="">