我正在查看group_cache_key方法的代码,以前从未见过这种编写方式:

require 'activerecord'
require 'activesupport'
require 'digest/md5'

ActiveRecord::Base.class_eval {
  Array.class_eval {
    def cache_key
      if self.empty?
        'empty/' + self.object_id.to_s
      else
        ids_hash = Digest::MD5.hexdigest(self.collect{|item| item.id }.to_s)
        update_timestamp = max {|a,b| a.updated_at <=> b.updated_at }.updated_at.to_i.to_s
        create_timestamp = max {|a,b| a.created_at <=> b.created_at }.created_at.to_i.to_s
        self.first.class.to_s.tableize+'/'+length.to_s+'-'+ids_hash+'-'+create_timestamp+'-'+update_timestamp
      end
    end
  }
}

为什么这个方法是这样实现的?在aclass_eval内部有一个class_eval并在数组上定义cache_key有什么意义?

最佳答案

该方法的目的是除了为单个记录添加标准缓存之外,还为记录数组添加缓存,因此它是在Array中实现的。最有可能的是,作者试图通过将rubyArray类包装到一个类evalActiveRecord::Base中来避免污染它。这种方法不能防止这种污染,但它将添加所需的cache_key方法。

10-07 16:25
查看更多