圖片來自 Michael Dziedzic

使用序列化在兩個 Rails 站台間傳遞物件

本文轉載自 Leon 的網誌

一般 REST API 傳遞大多是用 HTTP post 發送 JSON、YAML、XML,不過這裡講的不是 client - server 的傳遞,而是 server - server 的傳遞,情境是 production 站與 staging 站間的物件傳遞,雖然說 Rails 有 seed 可以用來建資料,不過有時候開發上還是需要拿一些比較真實的資料來驗證,或者單純因為懶惰。

簡單解釋做法,就是把 production 上的物件序列化成檔案,再從 staging 站台抓下來還原城物件。在 Ruby 的世界,已經內建有 Marshal 模組來做序列化的工作,並且使用簡易。

練習隨機挑一個 book 物件,使用 Marshal 把它序列化後存到 Rails 的 public 位置:

b = Book.find(Book.ids.sample(1)[0])
File.open(Rails.public_path.join(Book.id, 'wb+') do |f|
  f.write(Marshal.dump(b))
end

然後切換到 staging 站台,去 production 站抓檔案,反序列化後存入資料庫:

f = open('http://10.100.99.72/619204')
f = Marshal.load(f)

b = Book.new
b.attributes = f.attributes
b.save

注意,直接跑 f.save 是沒用的,一定要建新的物件再指定 attributes。

可以再驗證一下:

b.reload
b

應該就可以看到有正確存入了。

不過 Marshal 也不是萬能的,牽扯到一些 IO 操作的物件或資料庫關聯的物件就會遇到一些問題了。

作者:Leon

不是五小編也不是七小編,就是六小編。

本文由 INFOLINK 聯騰資訊股份有限公司提供,聯騰資訊專注於為零售與餐飲產業提供智慧化的系統解決方案,以 ERP 為核心為客戶開拓 E 化應用,與 POS、BI、EC 等應用實現無縫整合,我們在此分享我們對產業與技術的觀點,歡迎與我們交流或追蹤我們。