现在的位置: 首页 > 综合 > 正文

关于Rails serialized属性

2018年01月10日 ⁄ 综合 ⁄ 共 1989字 ⁄ 字号 评论关闭

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  

抱歉!评论已关闭.