iT邦幫忙

第 11 屆 iThome 鐵人賽

DAY 24
1

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

上一篇
DAY 23 Rails 中 Model 關聯
下一篇
DAY 25 資料庫( SQL ) 建立表格 欄位介紹
系列文
毫無基礎學習 Ruby on Rails 的 甘苦心得30
圖片
  直播研討會
圖片
{{ item.channelVendor }} {{ item.webinarstarted }} |
{{ formatDate(item.duration) }}
直播中

尚未有邦友留言

立即登入留言