關於Rails serialized屬性

Active Record 有個serialized屬性,簡單說說關於這個屬性的一些東西

1. 幹什麼用的


    實現在文本字段存儲序列化的值.即,序列,哈希表,數組等.   

2. serialized怎麼用

以下是官方API中的例子
Ruby代碼  收藏代碼
  1. class User < ActiveRecord::Base  
  2.   serialize :preferences # users表中有preferences字段,類型是文本的  
  3. end  
  4.   
  5. user = User.create(:preferences => { "background" => "black""display" => large })  
  6. User.find(user.id).preferences # => { "background" => "black", "display" => large }  
  7.   
  8.   
  9. class User < ActiveRecord::Base  
  10.   serialize :preferencesHash#指定了序列化類型  
  11. end  
  12.   
  13. user = User.create(:preferences => %w( one two three ))#賦值是array類型  
  14. User.find(user.id).preferences    # 提示序列化類型不匹配錯誤raises SerializationTypeMismatch  


3. 幫助理解的例子

數據庫有個settings表,該表有id和文本的menu屬性
Ruby代碼  收藏代碼
  1. #model描述  
  2. class Setting < ActiveRecord::Base  
  3.   serialize :menu  
  4. end  


Ruby代碼  收藏代碼
  1. # 創建記錄  
  2. s = Setting.new  
  3. => #<Setting id: nil, menu: nil>  
  4.    
  5. # 分配序列menu值,例子2個,可以更多  
  6. s.menu = [ 'subscription''membership' ]  
  7. => ["subscription""membership"]  
  8.    
  9. # 讀取該值,以便驗證  
  10. s.menu  
  11. => ["subscription""membership"]  
  12.    
  13. # 保存記錄  
  14. s.save  
  15. => true  

數據庫存儲數據如下:
Ruby代碼  收藏代碼
  1.  id: 1  
  2.  menu: --- \n- subscription\n- membership  
  3. #So it was serialized to YAML correctly.查看數據庫,可以知道成功序列化成YAML格式  

重新讀取
Ruby代碼  收藏代碼
  1.  s2 = Setting.find(1)  
  2. => #<Setting id: 1, menu: ["subscription", "membership"]>  
  3.    
  4.  # Read the menu attribute and So it was deserialized too   
  5.  # 表明反序列化成功  
  6. s2.menu  
  7.  => ["subscription""membership"]  



4. 在什麼情況下使用

這個API看不出來,我們可以假設一個情景. 當前,SNS網絡比較流行,對於當前用戶User的Blog可能有很多用戶訪問, 那麼,用戶之間可能是好友關係.這就需要判斷,而這個判斷經常會用到, 那麼,或者我們需要查詢一個類似friendship-status表,或者,需要一個很長的針對user id的查詢.

顯然,面對這樣的情景,都會需要比較長的時間.那麼,serialized在這種情況下,比較好用.就是把用戶id序列化到文本屬性就可以了.

5. Rails 2.1以後爲什麼不能保存


Ruby代碼  收藏代碼
  1. #會執行失敗  
  2. def add_to_friend_ids_cache(friend_id)  
  3. self.friend_ids_cache << friend_id unless self.friend_ids_cache.include?(friend_id)  
  4. self.save  
  5. end  

Ruby代碼  收藏代碼
  1. def add_to_friend_ids_cache(friend_id)  
  2. self.friend_ids_cache_will_change!#_will_change! method for handling dirty objects  
  3. self.friend_ids_cache << friend_id unless self.friend_ids_cache.include?(friend_id)  
  4. self.save  
  5. end  


發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章