Sha256: 8df4026e5624d3da7cdcf8da97e3b9b391c8f1f012d1bdf7ef1a41eb2878c407

Contents?: true

Size: 1.4 KB

Versions: 9

Compression:

Stored size: 1.4 KB

Contents

# frozen_string_literal: true

require "ar_lazy_preload/context"

module ArLazyPreload
  # ActiveRecord::Relation patch with lazy preloading support
  module Relation
    # Enhanced #load method will check if association has not been loaded yet and add a context
    # for lazy preloading to loaded each record
    def load
      need_context = !loaded?
      result = super
      if need_context
        Context.register(
          records: ar_lazy_preload_records,
          association_tree: lazy_preload_values
        )
      end
      result
    end

    # Specify relationships to be loaded lazily when association is loaded for the first time. For
    # example:
    #
    #   users = User.lazy_preload(:posts)
    #   users.each do |user|
    #     user.first_name
    #   end
    #
    # will cause only one SQL request to load users, while
    #
    #   users = User.lazy_preload(:posts)
    #   users.each do |user|
    #     user.posts.map(&:id)
    #   end
    #
    # will make an additional query.
    def lazy_preload(*args)
      check_if_method_has_arguments!(:lazy_preload, args)
      spawn.lazy_preload!(*args)
    end

    def lazy_preload!(*args)
      args.flatten!
      self.lazy_preload_values += args
      self
    end

    def lazy_preload_values
      @lazy_preload_values ||= []
    end

    private

    def ar_lazy_preload_records
      @records
    end

    attr_writer :lazy_preload_values
  end
end

Version data entries

9 entries across 9 versions & 1 rubygems

Version Path
ar_lazy_preload-0.3.2 lib/ar_lazy_preload/active_record/relation.rb
ar_lazy_preload-0.3.1 lib/ar_lazy_preload/active_record/relation.rb
ar_lazy_preload-0.3.0 lib/ar_lazy_preload/active_record/relation.rb
ar_lazy_preload-0.2.7 lib/ar_lazy_preload/active_record/relation.rb
ar_lazy_preload-0.2.6 lib/ar_lazy_preload/active_record/relation.rb
ar_lazy_preload-0.2.5 lib/ar_lazy_preload/active_record/relation.rb
ar_lazy_preload-0.2.4 lib/ar_lazy_preload/active_record/relation.rb
ar_lazy_preload-0.2.3 lib/ar_lazy_preload/active_record/relation.rb
ar_lazy_preload-0.2.2 lib/ar_lazy_preload/active_record/relation.rb