class GraphqlLazyLoad::ActiveRecordRelation

Attributes

association[R]
object_id[R]

Public Class Methods

new(type, association, **params, &block) click to toggle source
# File lib/graphql_lazy_load/active_record_relation.rb, line 5
def initialize(type, association, **params, &block)
  object_class = type.object.class
  context_key = [type.class, object_class, association]
  @object_id = type.object.id
  @association = association

  # Initialize the loading state for this query,
  # or get the previously-initiated state
  @lazy = type.context[context_key] ||= {
    objects_to_load: Set.new,
    ids: Set.new, # use ids cause cant compare objects
    results: {},
    params: params,
    block: block,
  }
  # Register this to be loaded later unless we've already queued or loaded it
  return if already_loaded_or_queued?
  # use copy of object so it doesnt add preload to associations.
  # this is so associations dont get loaded to object passed so different scopes get reloaded
  lazy_objects.add(
    object_class.column_names.reduce(object_class.new) do |acc, column|
      # only iterate over column in db so if select fields outside usual model
      # values wont throw error
      acc.send("#{column}=", type.object.send(column))
      acc
    end
  )
  lazy_ids.add(object_id)
end

Public Instance Methods

result() click to toggle source

Return the loaded record, hitting the database if needed

# File lib/graphql_lazy_load/active_record_relation.rb, line 36
def result
  if !already_loaded? && any_to_load?
    ActiveRecord::Associations::Preloader.new.preload(lazy_objects.to_a, association, scope)
    lazy_objects.each do |object|
      lazy_results[object.id] = object.send(association)
    end
    lazy_objects.clear
  end
  lazy_results[object_id]
end

Private Instance Methods

already_loaded?() click to toggle source
# File lib/graphql_lazy_load/active_record_relation.rb, line 67
def already_loaded?
  lazy_results.key?(object_id)
end
already_loaded_or_queued?() click to toggle source
# File lib/graphql_lazy_load/active_record_relation.rb, line 63
def already_loaded_or_queued?
  lazy_ids.include?(object_id)
end
any_to_load?() click to toggle source
# File lib/graphql_lazy_load/active_record_relation.rb, line 71
def any_to_load?
  lazy_objects.any?
end
lazy_block() click to toggle source
# File lib/graphql_lazy_load/active_record_relation.rb, line 59
def lazy_block
  @lazy[:block]
end
lazy_ids() click to toggle source
# File lib/graphql_lazy_load/active_record_relation.rb, line 75
def lazy_ids
  @lazy[:ids]
end
lazy_objects() click to toggle source
# File lib/graphql_lazy_load/active_record_relation.rb, line 79
def lazy_objects
  @lazy[:objects_to_load]
end
lazy_params() click to toggle source
# File lib/graphql_lazy_load/active_record_relation.rb, line 55
def lazy_params
  @lazy[:params]
end
lazy_results() click to toggle source
# File lib/graphql_lazy_load/active_record_relation.rb, line 83
def lazy_results
  @lazy[:results]
end
scope() click to toggle source
# File lib/graphql_lazy_load/active_record_relation.rb, line 50
def scope
  return nil unless lazy_block
  lazy_block.call(lazy_params)
end