Sha256: 90cc244b7b6f23fe6b9afa2289e7041138cb0e1ad84404b67772d80334ccb81b

Contents?: true

Size: 1.62 KB

Versions: 2

Compression:

Stored size: 1.62 KB

Contents

module IdentityCache
  module BelongsToCaching
    extend ActiveSupport::Concern

    included do |base|
      base.class_attribute :cached_belongs_tos
      base.cached_belongs_tos = {}
    end

    module ClassMethods
      def cache_belongs_to(association, options = {})
        raise NotImplementedError if options[:embed]

        unless association_reflection = reflect_on_association(association)
          raise AssociationError, "Association named '#{association}' was not found on #{self.class}"
        end

        options = {}
        self.cached_belongs_tos[association] = options

        options[:embed]                   = false
        options[:cached_accessor_name]    = "fetch_#{association}"
        options[:foreign_key]             = association_reflection.foreign_key
        options[:association_class]       = association_reflection.klass
        options[:prepopulate_method_name] = "prepopulate_fetched_#{association}"

        build_normalized_belongs_to_cache(association, options)
      end

      def build_normalized_belongs_to_cache(association, options)
        self.class_eval(<<-CODE, __FILE__, __LINE__ + 1)
          def #{options[:cached_accessor_name]}
            if IdentityCache.should_use_cache? && #{options[:foreign_key]}.present? && !association(:#{association}).loaded?
              self.#{association} = #{options[:association_class]}.fetch_by_id(#{options[:foreign_key]})
            else
              #{association}
            end
          end

          def #{options[:prepopulate_method_name]}(record)
            self.#{association} = record
          end
        CODE
      end
    end
  end
end

Version data entries

2 entries across 2 versions & 1 rubygems

Version Path
identity_cache-0.2.5 lib/identity_cache/belongs_to_caching.rb
identity_cache-0.2.4 lib/identity_cache/belongs_to_caching.rb