Sha256: a22028c6287117b9e2516573241cfe4a5a6a20dcf1f4ee2e8b7aeff655917477

Contents?: true

Size: 1.53 KB

Versions: 1

Compression:

Stored size: 1.53 KB

Contents

module JitPreloadExtension

  extend ActiveSupport::Concern

  included do
    attr_accessor :jit_preloader
    attr_accessor :jit_n_plus_one_tracking
    attr_accessor :jit_preload_aggregates
  end

  class_methods do
    delegate :jit_preload, to: :all

    def has_many_aggregate(assoc, name, aggregate, field, default: 0)
      method_name = "#{assoc}_#{name}"

      define_method(method_name) do
        self.jit_preload_aggregates ||= {}

        return jit_preload_aggregates[method_name] if jit_preload_aggregates[method_name]
        if jit_preloader
          reflection = association(assoc).reflection
          primary_ids = jit_preloader.records.collect{|r| r[reflection.active_record_primary_key] }
          klass = reflection.klass

          preloaded_data = Hash[klass
                                 .where(reflection.foreign_key => primary_ids)
                                 .group(reflection.foreign_key)
                                 .send(aggregate, field)
                               ]

          jit_preloader.records.each do |record|
            record.jit_preload_aggregates ||= {}
            record.jit_preload_aggregates[method_name] = preloaded_data[record.id] || default
          end
        else
          self.jit_preload_aggregates[method_name] = send(assoc).send(aggregate, field) || default
        end
        jit_preload_aggregates[method_name]
      end

      def reload(*args)
        self.jit_preload_aggregates = {}
        super
      end

    end
  end
end

ActiveRecord::Base.send(:include, JitPreloadExtension)

Version data entries

1 entries across 1 versions & 1 rubygems

Version Path
jit_preloader-0.0.5 lib/jit_preloader/active_record/base.rb