Sha256: 53eb6b90dadb652c41430a2b3aeea3ffaf617953b16ab188ac5779b393827424

Contents?: true

Size: 1.21 KB

Versions: 1

Compression:

Stored size: 1.21 KB

Contents

# frozen_string_literal: true

module ActiveRecord
  class SmartPreloader
    VERSION = '0.1.0'

    def self.call(records, association)
      case association
      when Hash
        association.each do |key, value|
          preloaded_records = call(records, key)
          call(preloaded_records, value)
        end
      when Array
        association.each do |key|
          call(records, key)
        end
      when Symbol, String
        ActiveRecord::Associations::Preloader.new.preload(records, association)
        records.flat_map(&association.to_sym.to_proc).compact
      when CompositeKey
        ActiveRecord::CompositeKeyPreloader.(records, association.association, association.key)
        records.flat_map(&association.association.to_sym.to_proc).compact
      when Proc
        records.select(&association)
      else
        if association.instance_of?(Class) && association.ancestors.include?(ApplicationRecord)
          return records.grep(association)
        end

        raise ArgumentError, "#{association.inspect} was not recognized for preload"
      end
    end

    def initialize(preloads)
      @preloads = preloads
    end

    def call(records)
      self.class.call(records, @preloads)
    end
  end
end

Version data entries

1 entries across 1 versions & 1 rubygems

Version Path
smart_preloader-0.1.0 lib/active_record/smart_preloader.rb