Sunday, May 21, 2006

Rails Memo #2

ครั้งก่อนพูดถึงการตั้งชื่อ Controller, View ไป
คราวนี้ลองมาดูกฎการตั้งชื่อ Model บ้าง

Model จะมาคู่กับ Database Table เสมอ
โดยชื่อ Model ต้องเป็นเอกพจน์ ส่วนชื่อ Table ต้องเป็นพหูพจน์

class Property < ActiveRecord::Base

ชื่อ table ที่ประกบกับ model นี้ ก็ต้องเป็น properties

ที่น่าสนใจก็คือ Rails ใช้กฎอะไรในการแปลง เอกพจน์ เป็น พหูพจน์
class ที่เกี่ยวข้องในเรื่องนี้ อยู่ใน package ActiveSupport
มีชื่อว่า Inflections กับ Inflector
ลองดูตัวอย่าง ตารางการแปลงของ Rails ดู
  inflect.plural(/$/, 's')
inflect.plural(/s$/i, 's')
inflect.plural(/(ax|test)is$/i, '\1es')
inflect.plural(/(octop|vir)us$/i, '\1i')
inflect.plural(/(alias|status)$/i, '\1es')
...

inflect.irregular('person', 'people')
inflect.irregular('man', 'men')
inflect.irregular('child', 'children')
...

inflect.uncountable(%w(equipment information rice money species series fish sheep))


ถ้าอยากรู้ว่าอะไรแปลงเป็นอะไร ก็สามารถใช้ script/console ทดสอบดูได้
~/projects/rail/akando_dev $ script/console
Loading development environment.
>> "person".pluralize
=> "people"
>> "mouse".pluralize
=> "mice"
>>


ทีนี้กระโดดไปที่ scaffold บ้าง
เวลาที่เราสั่ง generate scaffold เราใช้คำสั่งต่อไปนี้
script/generate scaffold modelName
แน่นอน modelName ที่ระบุใน scaffold อยู่ในรูปเอกพจน์
แต่ชื่อของ controller ที่ scaffold generate ให้นี้จะอยู่ในรูป พหูพจน์
เช่น
script/generate scaffold Property

จะได้
class PropertiesController ใน file properties_controller.rb

เรื่องการใช้เอกพจน์ หรือพหูพจน์นี้ จริงๆพอใช้ไปสักพัก ก็จะเริ่มรู้สึก
เป็นธรรมชาติขึ้น (ฝรั่งคงไม่มีปัญหา เพราะเป็นภาษาเขา)
ซึ่งมันก็สื่อดีเหมือนกัน เช่น

Project.find(1)
ย่อมดีกว่า
Projects.find(1)
----
project = Project.find(1)
project.milestones.each {|milestone|
...
}
ดูดีกว่า
project.milestone.each {|milestone|
...
}

Related link from Roti

No comments: