RoR week5 Active Record








本週重點 Active Record
去看這裡的所有關於Active Record相關的介紹
R (routes.rb) ----> C(Controller)  ----> M(model) 
C(Controller) --> V(view)
建一個rails專案
rails new ntu_student
使用rails console來查看常用字的複數是什麼

在Rails裡面的慣例
Model 名字:例如 Student (大寫) , Book
table 名字:例如 students (小寫複數), books
Profile.all 是把所有資料列出來
去這個資料夾裡面進入rails console (rails c)驗證一下上述指令
Profile.find(1)
找出id=1的資料
Profile.create(name:'kk', email:'kkk@google.com', tel:'0921')
寫一筆資料進去


再建一個表格
rails g scaffold student 後面接想要的欄位
我的長這樣
rails g scaffold student student_no department grade:integer profile_id:integer note:text
table裡面有學生的學號,科系,年級,連結到profle表格的id,備註欄位
foreign key 規則:
例如 student 表格裡面要一個foreign key參照到profile表格,則在student表格裡面要放個 profile_id的欄位,他會自動參照到profile表格裡面的id欄。

做完這步時, 別忘了要 
rake db:migrate

建立兩個table的關聯
去編輯model裡面的
student.rb 以及 profile.rb 這兩個檔案
這樣子設定是在說,一個profile 與 student 是一對一的,做完這個設定,可以使得
profile.student生效
student 屬於 profile  這個設定可以使得 student.profile也生效
整理 &補充說明:
甲 has_one 乙 的關係為,一對一,一個甲可以擁有一個乙,乙裡面會有 foreign key指向甲,可利用 乙 belongs_to 甲做反向參照的設定
甲 has_many 乙 的關係為,一對多,一個甲可以擁有很多乙,乙裡面會有 foreign key指向甲,可利用 乙 belongs_to 甲做反向參照的設定

建立完關聯後去網頁新增一筆student資料
然後來console裡面玩玩看
令 p1 = Profile.first
p1.student 就會查詢到student表格裡面 profile id = 1 的那筆資料!

如何加一個姓名欄位把Profile表格裡面的name撈出來?
去view資料夾裡面,students資料夾裡面的index.html
加上第 7 行 與 第 20 行

建立一對多的關聯
一個學生可以修很多課,我們來實作一個(course) Selection表格
Student 與 Selection 之間是一對多的關係

首先來個 Course 課程資訊表格
裡面有 id, title(課程名稱), credit(學分數)
另一個表格叫做
Selection (選課表格)
一個 Student has_many CourseSelection
裡面有 id student_id(外部鍵) course_id(外部鍵)

建構步驟
rails g scaffold course title credit:integer
rails g scaffold selection student_id:integer course_id:integer
rake db:migrate
建構完成!

接著去 models 建立關聯

補充 bug: SQLite3::SQLException: 解決
使用 rails destroy scaffold XXXXX
之後重新建立時在rake db:migrate出現錯誤訊息
rake aborted! StandardError: An error has occurred, this and all later migrations canceled: SQLite3::SQLException:
解決方法:
  • rake db:drop:all
這步驟有風險,他會把你的資料庫裡的資料全部刪光QQ
再重新
  • rake db:migrate

<記取教訓>
以後要做 rails destroy scaffold xxxxxx 之前
要先做 
  • rake db:rollback
把db回復成之前的樣子
在安心地 destroy 

如果真的不小心沒辦法了需要針對特定table做刪除
可以去
  • rails dbconsole
對db 指令
  • drop table 資料表名稱

學生資料架構圖
has_many :xxxx , :through 中介表格名
本例中
has_many :through :selection

設定必填欄位
使用 validates  搭配 presence: true 
例如設定 profile 表格裡面的name欄位一定要填

驗證電話號碼長度

Demo


留言

這個網誌中的熱門文章

[筆記] CRLF跟LF之區別 --- 隱形的 bug

[ML筆記] Batch Normalization

[筆記] 統計實習(1) SAS 基礎用法 (匯入資料並另存SAS新檔,SUBSTR,計算總和與平均,BMI)

[ML筆記] Ensemble - Bagging, Boosting & Stacking