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