1. 幹什麼用的
實現在文本字段存儲序列化的值.即,序列,哈希表,數組等.
2. serialized怎麼用
以下是官方API中的例子
- class User < ActiveRecord::Base
- serialize :preferences # users表中有preferences字段,類型是文本的
- end
- user = User.create(:preferences => { "background" => "black", "display" => large })
- User.find(user.id).preferences # => { "background" => "black", "display" => large }
- class User < ActiveRecord::Base
- serialize :preferences, Hash#指定了序列化類型
- end
- user = User.create(:preferences => %w( one two three ))#賦值是array類型
- User.find(user.id).preferences # 提示序列化類型不匹配錯誤raises SerializationTypeMismatch
3. 幫助理解的例子
數據庫有個settings表,該表有id和文本的menu屬性
- #model描述
- class Setting < ActiveRecord::Base
- serialize :menu
- end
- # 創建記錄
- s = Setting.new
- => #<Setting id: nil, menu: nil>
- # 分配序列menu值,例子2個,可以更多
- s.menu = [ 'subscription', 'membership' ]
- => ["subscription", "membership"]
- # 讀取該值,以便驗證
- s.menu
- => ["subscription", "membership"]
- # 保存記錄
- s.save
- => true
數據庫存儲數據如下:
- id: 1
- menu: --- \n- subscription\n- membership
- #So it was serialized to YAML correctly.查看數據庫,可以知道成功序列化成YAML格式
重新讀取
- s2 = Setting.find(1)
- => #<Setting id: 1, menu: ["subscription", "membership"]>
- # Read the menu attribute and So it was deserialized too
- # 表明反序列化成功
- s2.menu
- => ["subscription", "membership"]
4. 在什麼情況下使用
這個API看不出來,我們可以假設一個情景. 當前,SNS網絡比較流行,對於當前用戶User的Blog可能有很多用戶訪問, 那麼,用戶之間可能是好友關係.這就需要判斷,而這個判斷經常會用到, 那麼,或者我們需要查詢一個類似friendship-status表,或者,需要一個很長的針對user id的查詢.
顯然,面對這樣的情景,都會需要比較長的時間.那麼,serialized在這種情況下,比較好用.就是把用戶id序列化到文本屬性就可以了.
5. Rails 2.1以後爲什麼不能保存
- #會執行失敗
- def add_to_friend_ids_cache(friend_id)
- self.friend_ids_cache << friend_id unless self.friend_ids_cache.include?(friend_id)
- self.save
- end
- def add_to_friend_ids_cache(friend_id)
- self.friend_ids_cache_will_change!#_will_change! method for handling dirty objects
- self.friend_ids_cache << friend_id unless self.friend_ids_cache.include?(friend_id)
- self.save
- end