418342 ภาคปลาย 2552/ปฏิบัติการที่ 5
ในปฏิบัติการนี้ เราจะสร้าง model, controller, และ view อย่างง่ายๆ สำหรับค้นหาข้อมูลในฐานข้อมูลของนักดนตรีสากล
เนื้อหา
สร้าง Rails Application และ Model
ให้คุณสร้าง rails application ชื่อ music ขึ้นมาใน directory หนึ่ง
หลังจากนั้นเราจะสร้าง model ชื่อ artist ด้วยการสั่ง
rails generate model artist
แล้วจงไปแก้ไขไฟล์ migration ที่ชื่อ db/migrate/<<timestamp>>_create_artists.rb เพื่อให้ในตารางมีฟีลด์ดังต่อไปนี้
ชื่อ | ชนิด |
name | string |
origin | string |
genre | string |
label | string |
homepage | string |
album | text |
track | text |
หลังจากนั้นให้สั่งให้ migration ทำงานด้วยคำสั่ง
rake db:migrate
เพื่อความสะดวก เราได้เตรียมฐานข้อมูลที่มีข้อมูลนักดนตรีเอาไว้ให้คุณแล้ว ให้คุณดาวน์โหลดไฟล์ development.sqlite3 แล้วนำมันไปแทนที่ไฟล์ development.sqlite3 ที่ rails สร้างไว้ในไดเรคทอรี db
หมายเหตุ: ไฟล์ development.sqlite3 นี้สร้างขึ้นมาจากข้อมูลนักดนตรีของ http://www.freebase.com (คุณสามารถดาวน์โหลดไฟล์์ต้นฉบับได้จาก http://download.freebase.com/datadumps/2009-10-01/browse/music/ โดยเอาไฟล์ชื่อ artist.tsv)
เขียนหน้าเว็บสำหรับแสดงผลศิลปินแต่ละคน
จงสร้าง controller ชื่อ artists
หลังจากนั้นไปแก้ไข ArtistsController ในไฟล์ app/controllers/artists_controller.rb โดยทำการเพิ่ม action ชื่อ show
Action show นี้ เมื่อเราเข้าถึงมันผ่าน url http://localhost:3000/artists/show/<<id ของศิลปิน>> แล้วจะต้องแสดงข้อมูลของศิลปินตาม screenshot ข้างล่างนี้
ข้อสังเกต:
- มีฟีล์ที่เราต้องแสดงผลอยู่ทั้งหมด 7 ฟีลด์ ได้แต่ name, origin, genre, label, homepage, album, และ track แต่ screenshot ข้างบนแสดงให้เห็นถึงแค่ album เท่านั้น เนื่องจากพื้นที่ไม่พอ
- ฟีลด์ genre, label, homepage, album, และ track นั้นความจริงแล้วเป็นลิสต์ของข้อมูล ในฐานข้อมูลจะเก็บเป็น string และ text ขนาดใหญ่ ซึ่งระหว่างข้อมูลแต่ละตัวจะมี comma (,) ขั้นอยู่ คุณจะต้องเขียนโปรแกรมเพื่อแปลงลิสต์ของข้อมูลในรูปแบบนี้ให้เป็น unordered list (ul ในภาษา HTML)
เขียนหน้าเว็บสำหรับค้นหาศิลปินตามชื่อ
หลังจากนั้นจะสร้าง action ชื่อ name_search ใน controller artists
หน้าเว็บเพจของ name_search จะอนุญาตให้ผู้ใช้ค้นหาศิลปินโดยป้อนชื่อหรือส่วนหนึ่งของชื่อของศิลปินที่คุณต้องการ โดยมันจะต้องแสดงผลตาม screenshot ข้างล่างนี้
ข้อสังเกต
- ผู้ใช้สามารถป้อนเพียงแค่ส่วนหนึ่งของชื่อก็ได้ เราแนะนำให้เวลาคุณทำการค้นหาด้วยคำสั่ง find จงใช้เครื่องหมาย GLOB ซึ่งอนุญาตให้คุณใส่ชื่อที่ต้องการค้นหาเป็น *abc* โดยที่ * แต่ละตัวแสดงถึงตัวอักษรตัวกี่ตัวก็ได้ เหมือนกับตอนที่คุณใช้ wildcard ใน shell ของระบบปฏิบัติการต่างๆ คุณสามารถดูรายละเอียดของเครื่องหมาย GLOB ได้ที่ http://www.sqlite.org/lang_expr.html
- คุณจะต้องพิมพ์จำนวนผลลัพธ์ที่ค้นหาได้ทั้งหมด เสร็จแล้วจึงแสดงผลการค้นหาแค่ 100 ผลแรกเท่านั้น คุณสามารถนับจำนวนผลการค้นหาทั้งหมดโดยใช้คำสั่ง count ซึ่งคุณสามารถดู documentation ของมันได้ที่นี่ http://api.rubyonrails.org/classes/ActiveRecord/Calculations/ClassMethods.html#M002187
- ในคอลัมน์แรกของตารางผลลัพธ์ คุณจะต้องสร้าง link ไปยังหน้า show ของศิลปินคนนั้นๆ
คุณสามารถดูตัวอย่างพฤติกรรมของหน้า name_search ได้ที่ http://theory.cpe.ku.ac.th:3000/artists/name_search (แต่ต้องรอให้ผมเปิดมันขึ้นก่อน)
ทำหน้าค้นหาตามเกณฑ์อื่นๆ
เมื่อทำเสร็จแล้ว ให้ลองทำหน้าเว็บให้ผู้ใช้สามารถค้นหาศิลปินตามเกณฑ์อื่นๆ เช่น อัลบัม แนวเพลง (genre) หรือผลงานเพลง (track)