巧用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)  

你可能感兴趣的:(Ruby,ActiveRecord)