418342 ภาคปลาย 2553/ปฏิบัติการที่ 5

จาก Theory Wiki
ไปยังการนำทาง ไปยังการค้นหา

ในปฏิบัติการนี้ เราจะสร้าง 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/2010-11-18/browse/music/ โดยเอาไฟล์ชื่อ artist.tsv)

เขียนหน้าเว็บสำหรับแสดงผลศิลปินแต่ละคน

จงสร้าง controller ชื่อ artists

หลังจากนั้นไปแก้ไข ArtistsController ในไฟล์ app/controllers/artists_controller.rb โดยทำการเพิ่ม action ชื่อ show

Action show นี้ เมื่อเราเข้าถึงมันผ่าน url http://localhost:3000/artists/show/<<id ของศิลปิน>> แล้วจะต้องแสดงข้อมูลของศิลปินตาม screenshot ข้างล่างนี้

Lab-05-show.png

ข้อสังเกต:

  • มีฟีล์ที่เราต้องแสดงผลอยู่ทั้งหมด 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 ข้างล่างนี้

Lab-05-name search.png

ข้อสังเกต

  • ผู้ใช้สามารถป้อนเพียงแค่ส่วนหนึ่งของชื่อก็ได้ เราแนะนำให้เวลาคุณทำการค้นหาด้วยคำสั่ง 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)