ADZ 學習筆記

Ruby/Rails, Startup, Life

Rails 筆記 - activerecord 實作 (三) - serialize

| Comments

在設計 schema 時,有些欄位不會被 直接搜尋或排序 而且需要像是 mongodb 的 free schema 特性,可以考慮用 activerecord 的 serialize 功能。

範例 Hash

app/models/user.rb
class User < ActiveRecord::Base
  serialize :bank_info, Hash
end
# 取值可直接

User.find(1).bank_info[:account_numbers]
User.find(1).bank_info[:bank_code]

因為是整包 hash 存進 bank_info 這個欄位,所以即使是更新 hash 中其中一個 key 也必須整包拉出來 update,像是 increment 這種 atomic 的 query 也就無法支援了。

範例 Store

如果 hash 中的 key 是 固定的 schema,也可透過 store 來定義 hash serialize,好處是它會用你預先定義好了 keys,幫你產生 dirty objects,而且可以像你真的有這個 column 一樣存取

app/models/user.rb
class User < ActiveRecord::Base
    store :bank_info, accessors: [ :account_title, :account_numbers, :bank_code ], coder: JSON
  # 預設 hash 是以 yaml 儲存,上面的 coder: JSON 是指定儲存方式為 json

end

使用方法

u = User.find(1)
u.account_title_changed? # false

u.account_title = 'ADZ' 
u.account_title_changed? # true

u.save!

支援型別的 serialize (super_accessors)

但發現一個問題,如果使用 simple_form 儲存到 serialize 裡的資料都會是 string,如果想要實際儲存數字、布林就要使用另外一個 gem。

super_accessors

使用方式就參考 README 吧

Comments

comments powered by Disqus