有時,能夠在某個屬性中直接存儲任意的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::Base serialize :last_five # ... end
當我們創建了一個新的Purchase對象,我們可以給last_five列賦任何值,在這個例子裡,我們給last_five列設置一個字符串數組,
purchase = Purchase.new purchase.name = "Dave Thomas" purchase.last_five = [ 'shoes', 'shirt', 'socks', 'ski mask', 'shorts' ] purchase.save
當我們讀入它的時候,這個屬性已經被設置為數組:
purchase = Purchase.find_by_name("Dave Thomas") pp purchase.last_five pp purchase.last_five[3]
代碼的輸出為:
["shoes", "shirt", "socks", "ski mask", "shorts"] "ski mask"
盡管這個功能是很強大且便利的,但是只有當你不打算在ruby以外的項目中使用這些序列化的信息,除非那個程序也能夠使用YMAL格式。特別是,這些信息很難被SQL查詢所利用,你也許會考慮使用聚合(aggregation)來替代,在後面我們會介紹這種辦法來達到相同的效果。