巧用update_attribute

我当前的项目中有一个User model, 大体如下:
ruby 代码
 
  1. class User < ActiveRecord::Base  
  2.   validates_uniqueness_of :username:email  
  3. end  
一般对user对象的修改主要有如下两种场景:
  1. 修改用户的基本信息,如email, nickname, ......
  2. 当用户上传文件到自己的空间时,需要更新user的disk_used属性
本可以用如下代码完成disk_used属性的更新:
ruby 代码
 
  1. # uploading files ....  
  2. # calculating total file size.....  
  3. current_user.disk_used = current_user.disk_used + total_file_size  
  4. current_user.save  
这段代码看起来好像没什么问题,但细想起来,每次user.save之前都要执行所有的validation, 对于一般的validation还可以接受,可是对于validates_uniqueness_of 这种validation很可能导致性能问题,众所周知,validates_uniqueness_of每次都要发出一次select请求, 更糟糕的是我们的应用中用户会频繁的上传文件。另一方面,每次只更新user的disk_used属性,并不需要执行所有的validation.

这时候update_attribute派上用场了:
ruby 代码
 
  1. # uploading files .....  
  2. # calculating total_file_size....  
  3. current_user.update_attribute(:disk_used, current_user.disk_used + total_file_size)  
上面的代码不但提升了性能,而且更加简洁,更重的是它使得代码的意图更加清晰:只更新disk_used属性(区别于修改用户基本信息的场景)。我们可以更近一步使代码更加清晰:
ruby 代码
 
  1. class User < ActiveRecord::Base  
  2.   def increase_disk_used(file_size)  
  3.       update_attribute(:disk_used, disk_used + file_size)  
  4.   end  
  5. end  
  6.   
  7. #uploading files ....  
  8. #calculating total_file_size  
  9. current_user.increase_disk_used(total_file_size)  
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值