Method: ModelCached::ClassMethods#cache_by

Defined in:
lib/model_cached.rb

#cache_by(*column_names) ⇒ Object



7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
# File 'lib/model_cached.rb', line 7

def cache_by(*column_names)
  options = {logical_delete: nil, scope: nil}.merge(column_names.extract_options!)
  options[:columns] = column_names
  after_save :refresh_mc_keys
  after_touch :refresh_mc_keys
  after_destroy :expire_mc_keys
  class_eval %{ def self.mc_options; #{options}; end }
  column_names.each do |column|
    class_eval %{ def self.find_by_#{column}(value); find_cached_by(#{column.to_s.inspect}, value); end }
  end
  if column_names.include?(:id)
    class_eval do
      def self.find(*args)
        if args.size == 1 and (id = args.first).is_a?(Integer)
          find_by_id(id) || raise(ActiveRecord::RecordNotFound, "Couldn't find #{name} with ID=#{id}")
        else
          super(*args)
        end
      end
    end
  end
  include ModelCached::InstanceMethods
end