有時,能夠在某個屬性中直接儲存任意的ruby對象是很方便的,一種辦法就是Active Record支援序列化,將一個ruby對象變為一個YMAL字串,並且將這個字串儲存到屬性對應的資料庫欄位中。在資料庫定義中,這個欄位必須為text類型。
因為Active Record將資料庫中的Char型和text型映射為ruby的string型,所以如果我們需要告訴Active Record使用序列化功能,例如,我們想知道某個客戶進行的最後的5次消費,我們建立一個含有text類型欄位的表來儲存資訊:
create table purchases (id int not null auto_increment,name varchar(100) not null,last_five text,primary key (id));
在轉換這個表的Active Record類中,我們要使用serialize()聲明,來告訴Active Record要排列對象:
class Purchase < ActiveRecord::Baseserialize :last_five# ...end
當我們建立了一個新的Purchase對象,我們可以給last_five列賦任何值,在這個例子裡,我們給last_five列設定一個字串數組,
purchase = Purchase.newpurchase.name = "Dave Thomas"purchase.last_five = [ 'shoes', 'shirt', 'socks', 'ski mask', 'shorts' ]purchase.save
當我們讀入它的時候,這個屬性已經被設定為數組:
purchase = Purchase.find_by_name("Dave Thomas")pp purchase.last_fivepp purchase.last_five[3]
代碼的輸出為:
["shoes", "shirt", "socks", "ski mask", "shorts"]"ski mask"
儘管這個功能是很強大且便利的,但是只有當你不打算在ruby以外的項目中使用這些序列化的資訊,除非那個程式也能夠使用YMAL格式。特別是,這些資訊很難被SQL查詢所利用,你也許會考慮使用彙總(aggregation)來替代,在後面我們會介紹這種辦法來達到相同的效果。