ค้นหาบล็อกนี้

วันอังคารที่ 22 มิถุนายน พ.ศ. 2553

เว็บไม่มีหน้า

วันนี้ำได้ฟังอาจารย์ รวิทัตพูดเกี่ยวกับเว็บไม่มีหน้า ตอนแรกก็งง ว่าถ้าเว็บไม่มีหน้่าแล้วจะแสดงผลยังไง
ซึ่งก่อนหน้านี้อาจารย์ไำด้พูดเกี่ยวกับหลายๆเรื่อง ว่า ประโยคที่ว่้า คอมพิวเตอร์ นั้นได้มีบทบาทในการดำเนินชีวิตคงอาจจะใช้ไม่ได้...อีกแล้ว(เนื่องจาก อีกต่อไปข้างหน้า everything is computer ทุกอย่างจะเป็นคอมพิวเตอร์ เพราะอาจารย์ก็ได้โชว์ปากกาที่สามารถบันทึกเสียงและภาำพ ซึ่งจะบันทึกสิ่งที่จดบนกระดาษกับเสียงที่บันทึกแล้วสามารถพลอตจุดx,y บนกระดาษส่งขึ้นเว็บได้โดยที่จะบันทึกสิ่งที่จดบนกระดาษกับเสียงที่พูดมีสิ่งที่เชื่อมกันก็คือเวลา นั่นเอง หมายความว่า ณ เวลา t ใดๆ ก็จะส่ง พิกัด (x,y)และเสียงที่ record ณ เวลานั้น ขึ้นเป็น streamming video ได้ ซึ่งตามกระบวนการของ คอมพิวเตอร์แล้ว จะมีinput process output ก็เค้าก็ไม่ได้บอกว่า input จะต้องเป็น keyboard หรือ mouse หรือไม่ก็ output จะเป็นต้องเป็นหน้าจอแสดงผลเท่านั้น ซึ่งโดยปัจจุบันแล้วคนเีรามักถูกตีกรอบในการพัฒนาแต่โปรเซส เท่านั้น เพราะ นึกเพียงแต่จะใช้ input กับ output เป็น keyboard หรือไม่ก็แสดงผลด้วยหน้าจอเท่านั้น ซึ่งในอนาคตข้างหน้า หากเราสามารถหา input และ output มาแทนหน้าจอได้ ก็อาจจะทำให้โลกเปลี่ยนไปจากเดิมเยอะทีเดียว ลอง นึกภาพiron man 2 ดู ถ้าเราสามารถสร้าง ฮอโลแีกรมได้ก็คงดี ซึ่งสิ่งต่างเหล่านี้ได้เกิดขึ้นแล้วแต่ยังไม่มีการนำมาใช้เนื่องจากจะต้องดูราคาในเรื่องการผลิต ซึ่งก็เป็นธรรมดาอยู่แล้ว)แล้วที่ำำพูดมาทั้งหมด เกี่ยวอะไรกับ เว็บไม่มีหน้า ก็ไม่ค่อยเกี่ยวกันไง อยากพูดเฉยๆ คำถามต่อไป ก็คือ แล้วจะแสดงผลที่ไหนเล่า ? เคยสงสัยไม๊ว่า เวลาเราจะuploadภาพไปบน flickr หรือ ตาม เว็บ บล็อกที่มีให้ upload มันก็จะต้องเข้าไปเว็บบล็อกนั้น แล้วก็คลิ๊กlink ให้มีupload formแล้วก็ browse เลือกรูป แล้ว ก็กด upload หลายขั้นตอนมาก แต่หากเรา ใช้โปรแกรมจัดการรูปเวลาเราเลือกรูปเสร็จเราต้องการ upload เราก็เลือกรูปในโปรแกรม แล้วกดปุ่้ม public เลยรูปก็จะไปขึ้นบน flickr เช่นกัน ดังนั้น หากถามว่า ถ้าเว็บไม่มีการแสดงผล มีไว้ทำแมวอะไร ก็คงต้องบอกว่า เว็บจะเป็นเว็บได้ก็เพราะมีการลิงค์ข้อมูลกันแบบใยแมงมุม สิ่งที่เ้ป็นช่องทางในการลิงค์อีกอย่างก็คือ URL เราสามารถเข้าถึงข้อมูลหรือ บริการต่างๆได้ผ่านช่องทางหนึ่งก็คือ URLที่เป็นไป ตามหลักการออกแบบเว็บ ด้วย REST ...

ปล. บทความนี้ ผมสรุปจากการฟังอาจารย์ พูดมาให้ฟังซึ่งบางตอนผมก็อาจคิำดไปเองบ้างก็ขอให้พิจารณากันดูก็แล้วกัน

วันอังคารที่ 18 พฤษภาคม พ.ศ. 2553

เพิ่มcommentsในblog

เราจะทำการเำพิ่มcommentsให้กับblogของเราโดยที่ความสัมพันธ์ระหว่างcommentกับarticle
เป็น(Article has many Comments and Comment belongs to Article)

1. ruby script/generate scaffold comment title:string description:string article_id:integer
2.rake db:migrate
3.ใน model/comment.rb
belongs_to :article
4.ในmodel/article.rb
has_many :comments
5.ในconfig/routes.rbให้
map.resources :article ,has_many=>comments
6.rake db:migrate
7.ใช้conceptเดิม เหมือนกับ author กับ article โดยในหน้า่ของshow.html.erb
ของcontroller =>articles ให้เขียนform_for เข้าไปยังaction create ของ controller
=>comments ทำได้ดังนี้

<%form_for :comment, @comment,:url=>article_comments_path(@article) do |f|%>
<%=f.text_field :title%>
<%=f.text_field :description%>
<%=f.submit "send"%>
<%end%>

โดยที่createของcontroller =>comments ให้เขียนโค๊ดดังนี้
@comment=Comment.new(params[:comment])
@article=Article.find_by_id(params[:author_id])
@article.comments<<@comment ใน action=>show ของcontroller=>comments
@comment=Comment.find_by_id(params[:id])
@article_link=Article.find_by_id(@comment.article.id)
redirect_to article_path(@article_link)

วันเสาร์ที่ 15 พฤษภาคม พ.ศ. 2553

render VS redirect_to

พอเริ่ม เล่น rails ไปเรื่อยๆ เหมือนอะไรๆจะเข้ามาเต็มไปหมด บางทีก็เลยมืนๆ เกี่ยวกับบางเรื่อง เช่น
render กับ redirect_to สำหรับ ผู้ที่เล่นจนคล่องแล้ว คงจะบอกว่ามันน่าสับสนตรงไหน แต่สำหรับคนที่เำพิ่งเ้ริ่มเล่น ก็มีงงบ้างว่า ควรจะใช้ 2ตัวนี้ในสถานการณ์ไหน
render คืือการสั่งให้ทำงานในส่วนของ views template ซึ่งหากจัดการเกี่ยวกับ database ก็จะส่งข้อมูลมายังcontroller แล้วเราก็สร้างหน้าตาของส่วนแสดงผลข้อมูล ที่ views template เพื่อ generate ให้ เป็น html ต่อไป
render
render :action=>:hello , :controller => :test

ส่วน การ redirection เป็นการส่ง request ผ่าน url โดย จะส่ง request กลับไป เป็นค่าเดิมที่้รับมาการrequest เดิม หรือส่งค่าใหม่กลับไปยัง action ในweb app เดียวกัน หรือต่างกันก็ได้ ต่างเว็บก็ยังได้
แต่ที่สำคัญเราสามารถส่งrequestที่มาต่อไปได้ (น่าจะเป็นอารมณ์เดีัยวกับ forward mails )
redirect_to :action=> :hell0 ,:controller =>:test , :name=>params[:name]
redirect_to :url=>"http:\\www.google.com"
redirect_to article_comments_path(@instance)

Rails practice I:: ลองเขียน blog โง่ๆ อันนึง

ได้ลอง สร้าง blog กากๆ จาก rails อยาก บอกว่าลักไก่มากๆ เนื่องจากเพิ่งเริ่มทำเป็นอันเแรก มาเริ่มกันเลยดีกว่าิเริ่มจากสิ่งที่จะทำคือ สร้าง blog ขึ้นมา อันนึงให้สร้าง account ของ คนเขียน บทความคือ author โดยคนเขียน หนึ่งคนสามารถสร้าง article ได้หลายarticle ...ดังนั้น ความสัีมพันธ์ระหว่าง author กับ article จึงเป็น แบบ one to many (author has many articles and article belongs_to author)
1. rails -d mysql myblog
2.cd myblog
3.สร้าง database myblog_development ใน mysql //ใช้ภาษาำไทย ไม่ได้เป็นไรไม่รุ ไว้ก่อนแล้วกัน
4.ruby script/generate scaffold author name:string surname:string
5.ruby script/generate scaffold article title:string content:text author_id:integer
6.rake db:migrate
7.ไปที่ models (/app/models)
ใน article.rb
class Article
belong_to:author
ใน author.rb
class Author
has_many :articles
8.ไปที่ routes.rb (/config/routes.rb) ให้เพิ่มดังนี้
map.resources :articles
map.resources :authors ,:has_many=>:articles//เพื่อสร้างsub route

เนื่องจากจะช่วยมากเลยในการเขียนเชื่อมระหว่างauthorกับ articleด้วยhelper tag path
เช่น author_articles_path,:method=>:post//จะลิงค์ไปยัง:action=>:createของ:controller=>:articlesแล้วที่สำคัญสามารถส่งauthor_idผ่านrequestได้อีกด้วยเจ๋งโคตร
ทำให้ได้routeไปarticles/id

จากนั้น ดู routes ทั้งหมด
rake routes >temp.txt //เพื่อจะได้ ใช้ helper tag เพื่อลิงค์ไปยัง :action ,:controllerได้อย่างถูกต้อง
9. ทดสอบความถูกต้อง ruby script/server
http://localhost/articles
http://localhost/authors

10.เนื่องจากเราต้องการให้มีการสร้าง author ก่อน แล้วจึงให้มีการเขียน blog ได้ ให้เราแก้ไขดังนี้

- ไปที่ show.html.erb (/app/views/authors/show.html.erb)ให้เพิ่ม link "write blog" ไว้โดยเราจะส่ง id ไปยัง action "new" ใน articles controller
<%=link_to 'Write Blog',new_author_article_path(@author_id),:method=>:get %>
// new_author_article GET /authors/:author_id/articles/new {:controller=>"articles", :action=>"new"} ดูจาก temp.txt

-ไปที่ articles_controller .rbให้เพิ่ม @author=Author.find(params[:author_id])และ@article=Article.new ใน action new เพื่อ รับ :author_id จากการ link ใน show.html.erb

-ไปที่ new.html.erb เราจะส่งค่าของtitle,contentของinstanceของArticleไปยังaction"create"ผ่านrequest keyที่ชื่อ":article"โดยใช้
form_for ดังนี้

<%form_for :article,@article,:url=>author_articles_path do |f|%>
<%=f.text_field :title%>
<%=f.text_area :content%>
<%=f.submit "create"%>
<%end%>
ด้วยการroutingแบบส่งidไปตามrequestด้วย หากต้องการเพิ่ม article เราจำเป็นต้องเข้าไปยังauthorก่อน เราำไม่อาจเข้าไปยังarticleแล้วเพิ่มarticleได้โดยตรง
คำอธิบาย
เนื่องจากform_forเป็นการส่งข้อมูลผ่านทางrequestเำพื่อเป็นการสร้างinstanceของclassในรูปแบบของformกรอกข้อมูลจากตัวอย่างอธิบายได้คือเราจะสร้างformกรอกข้อมูลให้กับบทความที่จะสร้าง
โดยที่

:articleคือparams[key]คือhashนั่นเองที่เราจะส่งผ่านrequestดังนั้นค่าของ
params[:article]={:title=>".......",:content=>"........."}

@articleเป็นinstanceของclassArticleในmodelโดยที่เราจะต้องสร้า่งinstanceในcontroller articles action"new"ก่อน@article=Article.new

:url=>author_articles_pathเป็นhelper tagในการrouteไปตามpathที่ได้ทำการmap.resourceดูได้จากrake routes>tmp.txt ในที่นี้จะส่งไปยัง createเพื่อสร้างบทความเนื่องจากinstanceยังไม่มีค่าแต่ถ้ามีค่าจะเป็นการupdate

f.text_fieldเป็นการสร้างtext filedในการรับค่าจากuserเพื่อส่งไปยังproperty":title"
ดังนั้นหลังmethods"tex_field" จึงต้องเป็น property ของ instance@articleเท่านั้น

โดยform_forทั้งหมดส่งไปตามurlที่ระบุไปที่actionหรือcontrollerโดยจะส่ง:author_idผ่านrequestไปด้วย
ดังนั้น:actionปลายทางจะรับauthor_idดังกล่าวแล้วเราสามารถนำไปใช้ต่อได้
เ่ช่น @article=Atricle.new(params[:article])
@author=Author.find_by_id(params[:author_id])
@author.articles<<@article //เท่ากับบอกว่าauthorมีarticle@article(บทความที่เพิ่งสร้างใหม่)


วันศุกร์ที่ 14 พฤษภาคม พ.ศ. 2553

Ruby on Rails part IV

การสร้าง CRUD (Create Retrieve Update Delete)

1.ในการสร้างcrud โดยไม่ใ้ช่ scaffold
เราจะต้อง สร้าง model เช่น
ruby script/generate model student name:string surname:string
2.จากนั้นก็สร้าง controller
ruby script/generate controller students index new create update destroy edit show
3.จากนั้น ก็ไำปที่ config /routes.rb ไป map.resources :students

map.resources :students //students is a table name และ controller name ควรที่จะ ตรงกัน เนื่องจากหากมีการ route เกิดขึ้นซึ่งในที่ันี้ จะเป็น /students และ หากทำการ map.resources ดังกล่าว จะำได้ helper tag โดยจะมี path ที่ขึ้นต้นด้วย/students
<%form_for @student do|f |%>
<%=f.submit_tag "create/update"%>
<%end%>


Using Rails HelperTag for Access Resource
เนื่อง Rails มีการทำ resource mapping ซึ่งสามารถจัดการทรัำพยากร เช่น ตาราง students ใน database
โดยที่ ส่วนใหญ่แล้วเราก็ต้องมีบริการ พื้นฐานการจัดการ students เช่น การเพิ่ม จำนวน ลบ แสดงผล รายชื่อนักเรียน เป็นต้น เวลาที่เราจะไปใช้บริการดังกล่าวได้เราก็ต้อง route ให้ตรงกับบริการดังกล่าว(หลักๆแ้ล้วมี 7 ตัว)ซึ่งจะไปยัง controller ,action ต่างๆ ตามแปลความจาก routing path ดังนั้น rails จึงมีการสร้างการmap resources ไว้ใน route.rb ซึี่งเอาไว้สำหรับสร้างกฎการ route ให้กับ การบริการ resources ส่วนเรื่องรายละเอียดการบริการก็ต้องใช้action ใน controller เป็นตัวเชื่อมต่อกับ view เพื่อแสดงผลการบริการ


resources_path สามารถแปลงเป็น route ของ/
เช่น students_path ซึ่งเป็นไปได้ 2 กรณีคือ
ใช้กับ method 'GET' =>/resources
ใช้กับ method 'POST' => create

new__path เปลี่ยนเป็น route เช่น /resource/new

resources_path(instance) มีการรับparameter เป็น instance จะได้route เช่น /students/ 1
ซึ่งเราสามารถเลือก method เป็น DELETE กับ PUT ได้

ถ้าีinstance มีค่า =>/students/id =>show
ถ้า instance ไม่มีค่า => /students =>index

ถ้ามีค่า ตามด้วย method "put" =>put ของ id นั้น//ปกติใช้ form for เนื่องจากต้องส่งค่า
ถ้ามีค่า ตามด้วย method "delete" =>delete ของ id นั้น
<%=link_to "delete" , resource_path(instance) ,:method =>:delete %>


edit_resource_path(instance) => /resource/:id/edit
เช่น edit_student_path(@s1)

ส่วน การสร้าง link ไป ยัง create , update จะต้องใช้ form_for เนื่องจาก มีการ ใช้ method "POST " กับ "PUT"เช่น
<%form_for@student do |f|%>
Name<%=f.text_field :name %>
<%end%>
โดยที่ จะเป็นcreate หรือ update ขึ้นอยู่กับว่า @student มีค่าหรืิอไม่ ถ้ามี ->update ไม่มี ก็ไปที่ create ดังนั้น
หาก @student =Student.new // ไป action =>create
@student =Student.find(1) //ไป aciton=>update
ถ้าไม่มีการสร้าง action create หรือ update ไว้ ก็จะฟ้อง

ปล. <%=link_to %> กับ <%=button_to %> จะต่างกันที่ button_to จะมีไม่มีการ link ไปยัง path ที่ใส่ไว้ แต่เปลี่ยน แค่ URI เท่านั้น
เราต้องทำการ map resource ก่อน จึงจะสามารถใช้ helper tagได้
ถ้าเราำไม้่มีการ map resource ไว้ แต่เราก็สามารถ อ้างอิงได้ แต่เป็นไปตาม กฎของ route ที่มีอยู่้เช่น
<%= link_to "Back" , :controller =>:students,:action=>:index %>


ปล.ถ้าเข้าใจ concept แล้วให้ใช้ generate scaffold ไปเลย ซึ่งจะสามารถสร้างที่กล่าวมาได้ทั้งหมด

Method for managing in database
find(:id) // find(1)
find :all ,:limit,:conditions,:read_only,:order,:form
ex. find :all ,:select=>"id,name",
:limit=>3,
:conditions=>":name='benz' AND :surname='narak' ",
:form
=>"tables WHERE dept='cs' ",
:order=>"name DESC",
:read_only
=>true


find_by_* //find_by_name
find_by_sql "_______"

>>Student.methods
Student.create :name =>" ",:surname=>""
Student.new(params[:students])

Method for instance
student.save
student.delete
student.destroy
student.update_attributes :name , "benz"

วันพฤหัสบดีที่ 13 พฤษภาคม พ.ศ. 2553

Ruby on Rails part III

Helper ใช้ช่วยสร้าง HTML โดยที่ view template สามารถเรียกใช้ได้
รูปแบบการใช้งานhelper
<%= link_to "text" ,:action => :actionname %>
<%=button_to "buttonname" ,:action => :actionname%>
ซึ่งแนะนำให้ใช้ แทน html ทั้ืงหมด

ข้อสังเกต
<%=form_tag ''/test/hello%>



<%form_tag :controller = :test ,:action =:hello do%>

<%end%>
จะสังเกตเห็นว่า แบบแรกใช้ expression ส่วนแบบที่สองใช้ scriptlet ซึ่งส่วนใหญ่แล้ว scriptlet ก็คือ ไม่มี = จะใช้แสดงผล ของค่า ส่วน scriptlet จะใช้กับภาษา ruby ที่ำไม่มีการแสดงผลของ ค่า โดยจะเห็นว่ามีการใช้ <%end%> ครอบด้วย ซึ่งไม่ได้แสดงค่าอะไร ซึ่งหากแบบที่สอง ใส่เครื่องหมายเท่้ากับหน้า form_tag ก็จะcompile error

<%form_tag :action=>:hello do%>
<%=text_field_tag "name" ,"benz" , :size=>6,:maxlength=>5 %>
<%=submit_tag "OK",:disable_with=>"Please wait"%>
<%end%>
อันนี้เจ๋ง กด OK แล้วตรงปุ่มจะเปลี่ยนเป็น Please wait
เจ๋งกว่า เมื่อกี้อีก ใส่รูปให้ปุ่มได้ด้วย

<%form_tag :action => :hello do%>
<%=text_field_tag "name"%>
<%=image_submit_tag "rails.png"%> #\public\images\rails.png
<%end%>

<%form_tag :action=>:hello do%>
<%=hidden_field_tag "name","hey"%>
<%= submit_tag "OK"%>
<%end%>

hidden_field _tag =>เอาไว้ซ่อน เวลาส่ง ค่ามีแต่ปุ่มให้กด
<%form_tag :action=>:hello do%>
<%=password_field_tag "name"%>
<%= submit_tag "OK"%>

What is your name?
<%form_tag :action=>:hello do%>
<%=radio_button_tag "name","benz"%>benz
<%=radio_button_tag "name1", "benznakub"%> benznakub
<%=radio_button_tag "neme2" , "benzs"%>benzs
<%=submit_tag "OK"%>
<%end%>
สังเกตว่า ตรง name หมายถึง group กล่าวคือ กลุ่มเดียวกันเลืิอกได้อันเดียว
ข้อดี อีกอย่างสามารถส่งพารามิเตอร์มาได้ เลย


Implement Model RelationShips
แบบ one to many เช่น ความสัมพันธ์ของ Author กับ Article
-> สร้าง model ของ Author แล้วกำหนด Attribute
-> rake db:migrate
->สร้าง model ของ Article แล้ว กำหนด Attribute โดยหนึ่งในนี้ต้องมี author_id เนื่องจาก ทั้งสองมีความ สัมพันธ์ โดยที่ Author (ผู้แต่ง) สามารถเขียน บทความ ได้ หลาย บทความ แต่ Article (บทความ )
หนึ่งบทความมีำคนแต่งไำด้คนเดียว(bussiness Rule) โดยสรุป แล้ว Article จะต้องเก็บ idของ author
เพื่อใช้ในการหาว่า คนแต่งบทควา่ม นั้น แต่บทความอะีไรไปบ้าง
->rake db:migrate
->จะต้องระบุความสัมพันธ์ในส่วนของ dbmodel (ไปที่ app/model/)ซึ่งจะมี class ของ Author กับ Article อยู่โดยที่
ใน class Author จะต้องมี has_many :articles
ใน class Article จะต้องมี belongs_to :author


วันอังคารที่ 11 พฤษภาคม พ.ศ. 2553

Ruby on Rails part II

Rails helper

Array of Objects
variable
local variable=> อยู่ใน method เป็นชื่อตัวแปร
instance variable =>@ จะมีค่าเมื่อมีการ assign ค่าผ่านทาง instance
class variable => @@

สรุป
ถ้าประกาศ
x เป็น local variable ใช้ ได้เฉพาะใน function หรือ scopeที่ประกาศไว้เท่านั้น
@x เป็น instance variable -> ควรประกาศตอนinitialize
เชื่อมกับ view template
@@x เป็น class variable -> สามารถอ้างอิงได้ทั้ง instance methods และ class method
$x เป็น class variable -> globle ไม่ถูกลบ ใน development จะเคลียร์ได้ ในproduction จะอยู่คงที่

class Ex
def self.___
end
end

Ex.___
Active Record เป็นคลาสที่จัดการเกี่ยวกับ database
Rails จะเชื่ิอมระหว่่าง Data model กับ database โดยคนเขียนโปรแกรมจะยุ่งแค่ data model ส่วนใน
database จะมีmethod จัดการ property ให้ในการติดต่อเพื่อที่จะต้องดึงข้อมูลของ property หรือ เก็บข้อมูลในdatabase จะใช้yml เป็นตัวบอก active record ว่าต้องเก็บไฟล์ไว้ที่ใด มีข้อมูลใดบ้าง

database.yml มีข้อมูลเกี่ยวกับฐานข้อมูลที่จะใช้งานในตอน development test และ production
-adapter
-host
-username
-database
-timeout

เมื่อเราสร้าง model จะมี ไดเรกทอรี \db\migrate โดยจะมีการสร้างไฟล์ 001_create_students.rb
เช่น เมื่อเราสร้าง Model Student จะได้
class createStudents
ชื่อตาราง คือ students
001 คือ version การ migration
ปล.หากเราต้องการแก้ไข migration เช่น เราสร้าง migration 001 หากเราต้องการแก้ไขmigration ดังกล่าวให้เราroll back ไปversion 000 ก่อน จากนั้น แก้ไฟล์.rb version 001แล้ว remigration ใหม่
ชนิดข้อมูลของ column
:binary
:boolean
:date :time :datetime
:decimal
:float
:integer
:string

methods self.up เปลี่ยนแปลงฐานข้อมูล
self.down ถอยกลับมาหนึ่งversion
เราจะใช้ block| t | ในคลาส CreateStudents กำหนด field ใน ตาราง ซึ่งเป็น property ของ class

Syntax
datamodel โครงสร้างสำหรับการเก็บข้อมูลลงในdatabase

ruby script/generate model student name:string dept:string
จะเป็นการสร้าง model testโดย
ชื่อของ class ไว้อ้างอิง class method ในการจัดการเกี่ยวกับ property
ใน /models/ จะมี student.rb


Migration
เป็นการสร้าง โครงสร้างตารางใน database ตามแบบ data model ที่เราได้ออกแบบไว้ โดยสิ่งที่เราจะต้องทำก็คือ
เราต้องสร้าง model ก่อน ด้วยคำสั่ง
ruby script/generate model student //ซึ่งจะเป็นการสร้าง data model ซึ่งโดยปกติแล้วจะมีการสร้าง migration เริ่มต้นมาให้ หากยังไม่มีการสร้าง migration version ของ มัน จะเป็น 000 (ใน /db/migrate/ จะมีำไฟล์ version_create_student.rb อยู่ด้วย)แล้วเมื่้อมีการ migration ครั้ิงแรกก็จะเป็น 001 โดยจะแบ่งเป็น 2ส่วน
-ในส่วนของ datamodel จะมีการสร้าง class studentให้สามารถจัดการ datamodel ได้ด้วยหลักการ oopและ การ relation กันของ datamodel
-ในส่วนของ database จะเป็นส่วนของการสร้างตารางใน database การเปลี่ยนแปลงโครงสร้าง database ตาม โครงสร้าง datamodel นั้น

การ remigration และการ rollback
เนื่องจากในการสร้างตารางในdatabase เราอาจมีการเปลี่ยนแปลง field ต่างๆดังนั้น จึงมีการให้สร้าง version ของ migration ขึ้น หากเราต้องการเพิ่มบาง filed จากโครงสร้างเดิม เราก็แค่สร้่าง version ใหม่
ตามแล้วใช้ method ในการ add_column ซะ (remigration) แต่เราจำเป็นที่ จะต้องสร้าง method ในการย้อนกลับสิ่งที่เรา้้เพิ่มเติมมาด้วยเผื่อเปลี่ยนใจ มั้ง (rollback) อาจเป็นนามธรรมเกิน สิ่งที่เราต้องทำก็คือ
-1.สร้าง migration ขึ้น
ด้วยคำสัั่ง ruby script/generate migration name
-2.จัดการ ไฟล์ ที่อยู่ใน /db/migration/ verrsion_name.rb เช่น เพิ่้ม method add_column ใน self.up และ method remove_column ใน self.down
โดยใช้หลักที่ว่า method self.up ทำอะไร ไปจากversion เดิม ใน self.down จะต้องทำกลับให้เหมือนกับ version เดิม เนื่องจาก
1.remigration self.up จะทำงาน หาก rollback self.down จะทำงาน

2.เราสามารถ remigrate ไปยัง version ข้างหน้า(เช่น จาก 1ไป3) ได้ โดยที่มันจะเริ่มทำงาน self.upจาก 1 ไป2 จาก 2 ไป 3 และในการ rollback ไปยัง version ข้างหลัง (เช่น จาก 3ไป 1 )ได้ โดยที่มันจะเริ่มทำงาน self.down จาก 3 ไป 2 และไป 1

3.ทำการ remigration หรือ rallback ด้วยคำสั่ง
rake db:migrate หรือ
rake db:migrate VERSION=2

4.ตรวจสอบ จากใน database ว่า มีfiled เพิ่มอ่ะป่าว

methods
add_column =>เพิ่ม คอลัมน์
rename_column =>เปลี่ยนชื่อ
change_column =>เปลี่ยน type

Syntax
Student.create(:name => "_____",:dept=>"____")
Student.find(1)
Student.find_by_symbol "___"
Student.find_by_sql "sql_language"
Student.find :all

Model Relation
One to One
One to Many
Many to Many

Validation and Callback
ตรวจสอบข้อมูลของค่าต่างๆ และตรวจสอบความถูกต้องตอน
ไหนก็ได้ เช่น ห้ามใส่ข้อมูลเกิน 10 มีอยู่2วิธี คือ ตรวจสอบเอง กับใช้ื built in
class Student <3 style="font-weight: bold;"><%=error_messeges_for :student%>


Built In
1. validate_presence_of =>
ตรวจสอบว่ามีค่า (ไม่เป็น nil)
2.validates_uniqueness_of =>
ไม่ซ้ำกับค่าที่มีอยู่แล้วในฐานข้อมูล
3.validates_inclusion_of =>
ต้องมีค่าในArray
4.validates_length_of

Callback Methods สามารถกำหนดการทำงาน validate ตอนไหนก็ได้ของ create
before_validation: function
before_create: function
เราต้องประกาศ def ด้วยว่าจะทำอะไรโดย
def dept_map
if self.dept=="cs"
__________
end

callback class ->สร้่างไฟล์.rb อีกไฟล์นึงใน models แล้วสร้าว class
class ______
def self.before_create(model)
if model.dept ==" "
____________
end
end
end




ตรวจสอบ dbModel
rake db:test:prepare
-เข้าไปที่ \test\unit แก้ไฟล์ .rb เพื่อตรวจสอบ
-พิมพ์ ruby test\unit\greet.test.rb ในcommand line
หรือใช้ rake test:units ตรวจสอบไฟล์ทั้งหมด

Make Assertions
หมือนตั้งสมมติฐาน
assert_equal "hello world" g.hello("world")

1 tests , 2 assertion , 0 failures , 0 errors

1 tests จำนวนfuncที่นำมาทดสอบ
2 assertion จำนวนที่ผ่านจากการตรวจสอบ
0 failures มีข้อผิดพลาด(ผิดที่ symantics)ที่ได้ค่าำไม่ตรงกับ assertion
0 errors ผิด syntax

syntax
assert_equal output , instance.f("__")
assert instant.f("___")

setup method ถ้า function ใน assertion จำเป็นต้องการใช้บางอย่างร่วมกัน
เช่น instance เดียวกัน สามารถ ประกาศไว้ใน setup เพื่อ share กันได้โดยsetup จะืำทำ
ก่อนมีการtest แต่ต้องป็นตัวแปร @___