零.前言
在操作Ruby on rails時(shí)按灶,總會(huì)遇到資料的的問(wèn)題寿桨,有時(shí)還會(huì)出現(xiàn)active record的顯示錯(cuò)誤汉柒,心裡總是很納悶active record到底是啥?
與資料庫(kù)之間的關(guān)係為何春叫、如何把這觀念給實(shí)作出來(lái)肩钠,所以才產(chǎn)生這篇的學(xué)習(xí)筆記。
以下會(huì)分成五個(gè)部分依序來(lái)理解暂殖,active record的概念价匠。
一、物件關(guān)係映射與active record是啥呛每?如何應(yīng)用在rails中踩窖?
首先,active record是MVC的M晨横,model的意味洋腮,表現(xiàn)商業(yè)邏輯與資料的層級(jí),負(fù)責(zé)新增與操作需要存放在資料庫(kù)的長(zhǎng)久資料手形,
而active record本身是物件關(guān)係映射系統(tǒng)的一種描述啥供。
active record模式中,物件將擁有持久化的行為與資料库糠,可以確保存取資料是物件的一部份伙狐,進(jìn)而教導(dǎo)使用者如何寫(xiě)入與寫(xiě)出物件
物件關(guān)係映射,是一種技巧,簡(jiǎn)稱(chēng)ORM鳞骤,目的是把程式中複雜的物件窒百,對(duì)應(yīng)到關(guān)聯(lián)式資料庫(kù)的資料表中黍判,取出資料時(shí)不需要用到SQL的語(yǔ)句豫尽,總體上減少了與資料庫(kù)存取的程式碼。
active record作為ORM的框架:當(dāng)中有很多重要功能顷帖,
包括表示model與資料美旧、
表示models之間的關(guān)係、
相關(guān)model的繼承(像是comment 與 article)贬墩、
持久化資料存入資料庫(kù)的驗(yàn)證(像是要一定要填姓名)
二榴嗅、active record慣例勝於設(shè)定
命名慣例:資料表是複數(shù)形;model類(lèi)別是單數(shù)型,第一個(gè)字母大寫(xiě)
資料庫(kù)綱要慣例:外鍵為應(yīng)用資料表加上_id來(lái)命名,比如item_id陶舞,在rails學(xué)習(xí)筆記(5)中嗽测,提到article_id,active record會(huì)在建立關(guān)聯(lián)時(shí)肿孵,找尋這樣的資料欄位唠粥。
三、新增active record models:
新增 Active Record Model 非常簡(jiǎn)單停做。只需要建立一個(gè)ActiveRecord::Base的子類(lèi)別即可
classProduct < ActiveRecord::Base
end
列表綱要的程式碼:
p = Product.new
p.name="Some Book"
puts?p.name?
四晤愧、覆寫(xiě)慣例名稱(chēng)
用ActiveRecord::Base.table_name=方法來(lái)指定對(duì)應(yīng)的資料表名稱(chēng):
classProduct < ActiveRecord::Base
self.table_name ="PRODUCT"
end
甚至也可以修改資料庫(kù)的欄位名稱(chēng):
classProduct < ActiveRecord::Base
self.primary_key ="product_id"
end
五、CRUD讀寫(xiě)資料:
new方法回傳一個(gè)新的物件蛉腌,而create會(huì)會(huì)傳新物件並存入資料庫(kù)官份,前者是創(chuàng)造出來(lái),不會(huì)儲(chǔ)存烙丛,還得加上x(chóng)xx.save才行
new得部分:
user?=?User.new
user.name="David"
user.occupation ="Code Artist"
create得部分:
user = User.create(name:"David", occupation:"Code Artist")
read的部分:
# return the first user named David
david = User.find_by(name:'David')
update得部分:
user = User.find_by(name:'David')
user.update(name:'Dave')
或者是批量修改
User.update_all"max_login_attempts = 3, must_change_password = 'true'"
delete部分:
user = User.find_by(name:'David')
user.destroy
六舅巷、驗(yàn)證資料:
classUser < ActiveRecord::Base
validates:name, presence:true
end
七、資料遷移
要真正的建立一張資料表河咽,需要執(zhí)行:rake db:migrate钠右;要回滾則是執(zhí)行:rake db:rollback。