iT邦幫忙

2022 iThome 鐵人賽

DAY 18
0

資料庫欄位存取

Ruby 在傳送 block 跟方法時,可以呼叫 define_method

class MyClass
  ["foo", "bar"].each do |method|
    define_method(method) {
      puts "Obj #{method}"
    } 
  end
end
  
myobj = MyClass.new
myobj.foo
myobj.bar

在這個 class 底下,有 "foo" 、 "bar" 讓 class 做出來的實體使用.做取用

在 Ruby 中,你可以依照需求替 class 加方法

即使 class 已經被定義,你一樣可以使用 define_method 去增加及重新定義方法

Open Class
Ruby 的語言特色之一,可針對現有的 class 增加方法,甚至可以改寫原有的方法

資料庫欄位存取之 method_missing

當你呼叫一個物件裡面沒有定義的方法, method_missing 會被呼叫,用來處理不存在的物件或者方法

假如你覆寫了 method_missing

你可以增加一層判斷,決定返回的值

如果沒有特別判斷,它就會找存在且相近物件的父層 method_missing 方法

但都沒有呢?就會回傳原本的錯誤訊息(NoMethodError)

但 method_missing 的效率不太高

所以當 method_missing 被呼叫時, ActiveRecord 會重新定義存取或 finder

第一次呼叫會比較慢,但後面就會快很多

SQL 與型別

欄位的值會從 hash 返回, hash 一般會從 SQLite 拿到值

假設今天要印出一個整數

你會得到一個固定長度的整數

這是 SQLite 的預設設定

但如果今天想做的是將數字轉成布林值 或者 hash轉換成 JSON

SQLite 沒辦法幫你達成,我們得需要另外寫方法


上一篇
Day 17 - ORM 環境
下一篇
Day 19 Rack Middleware
系列文
從0開始刻 淺談 Rails 的運作魔法30
圖片
  直播研討會
圖片
{{ item.channelVendor }} {{ item.webinarstarted }} |
{{ formatDate(item.duration) }}
直播中

尚未有邦友留言

立即登入留言