ActiveRecord
Active Record 是 MVC 的 M(Model),表現商業邏輯與資料的層級。Active Record 負責新增與操作需要持久存在資料庫裡的資料。Active Record 本身是物件關聯映射(Object Relational Mapping)系統的描述,以 Active Record 模式實作。
ActiveRecord是一種設計模式,它把從資料表的一筆資料包裝成一個物件,並可在物件上增加額外的邏輯操作,讓資料的存取更便利。
Active Record 是一種 ORM 框架,ORM ( Object Relational Mapping ) 是一種將關聯式資料庫映射至物件導向的資料抽象化程式設計技術,用於實現物件導向程式語言裡不同類型系統的資料之間的轉換。
Rilas中的Model其實並不是資料庫,而是一個廣義的資料抽象概念,他是依照ActiveRecord模式設計下的產物。
從實務面來看:
當我們去呼叫User.all就是跟User這個Model去資料庫要東西,他會幫我們轉換成資料語法,用資料庫語法進行查找,找到資料後交給Model,Model再把每一筆資料一個一個物件化並放在陣列中,傳回給我們;而這就是一種ActiverRecord的設計模式。
什麼是 ORM?
ORM (Object-relational mapping,物件關聯對映 ) 是一種將關聯式資料庫映射至物件導向的資料抽象化程式設計技術,用於實現物件導向程式語言裡不同類型系統的資料之間的轉換。從效果上說,它其實是建立了一個可在程式語言裡使用的「虛擬物件資料庫」。
它可以讓你使用物件導向語法來操作關聯式資料庫,非常容易使用、撰碼十分有效率,不需要撰寫繁瑣的SQL語法,同時也增加了程式碼維護性。
舉例來說:
User.all
轉變成SQL語法
select * from users
比起SQL語法,使用物件導向語法來操作的方式比較容易懂
以下是比較常用的例子
# 新增
@user = User.new(name: "kai", age: 27)
@user.save
User.create(name: "kai", age: 27)
# 讀取
user = User.first # 取得第 1 筆資料
users = User.first(3) # 取出前 3 筆資料並存放在陣列裡
user = User.find(1) # 只能找id/找不到會噴錯誤
User.find_by(id: 1) # 找不到回傳nil
User.all #取出所有使用者
User.select()
User.where("age > 18", gender: "female") #找出 大於18歲 性別為女性的使用者
User.order(:age) # 按照年齡大小,預設是由小排到大
User.order(age: :desc) # 按照年齡大小,由大排到小
User.order(age: :desc).limit(3) # 限制讀取筆數
#計算
User.count
User.sum(:age) #年齡總和
User.average(:age).to_f #平均年齡
User.maximum(:age) #找出最大年紀的
User.minimum(:age) #找出年紀最小的
# 更新:找出並使用 save
user = User.find(1)
user.name = "Terry"
user.save
# 使用 update 更新資料,可一次更新多個欄位,且不需要再呼叫 save 方法
user.update(name: "Terry", age: 20)
user.update_attributes(name: "Terry", age: 20) #跳過驗證
# 針對整個資料表下手
User.update_all(name: "Terry", age: 18) #要注意 這會更新資料表內所有的名字跟年紀
# 刪除
User.destroy(1) # 刪除index = 1的資料
User.delete(1)
User.destroy_by(id: 13)
User.destroy_by(name: 'Spartacus', rating: 4)
User.destroy_by("published_at < ?", 2.weeks.ago)
User.where(age: 0..18).destroy_all