Sha256: 62ce261062bb5b9f2e2e64a960e9f76c8976725445edccf65df5f504e6d6e248

Contents?: true

Size: 1.45 KB

Versions: 2

Compression:

Stored size: 1.45 KB

Contents

require "graphql"
require "graphql/query_resolver/version"

module GraphQL
  module QueryResolver

    def self.run(model_class, context, return_type)
      to_load = yield
      dependencies = {}

      reflection_dependencies = map_dependencies(model_class, context.ast_node)
      dependencies = reflection_dependencies.merge(dependencies)

      if dependencies.any? && to_load.present?
        if ActiveRecord::VERSION::MAJOR < 4
          ActiveRecord::Associations::Preloader.new(to_load, dependencies).run
        else
          ActiveRecord::Associations::Preloader.new.preload(to_load, dependencies)
        end
      end

      to_load
    end

    def self.map_dependencies(class_name, ast_node)
      dependencies = {}
      ast_node.selections.each do |selection|
        name = selection.name

        if class_name.reflections.with_indifferent_access[selection.name].present?
          begin
            current_class_name = selection.name.singularize.classify.constantize
            dependencies[name] = map_dependencies(current_class_name, selection)
          rescue NameError
            selection_name = class_name.reflections.with_indifferent_access[selection.name].options[:class_name]
            current_class_name = selection_name.singularize.classify.constantize
            dependencies[selection.name.to_sym] = map_dependencies(current_class_name, selection)

            next
          end
        end
      end

      dependencies
    end
  end
end

Version data entries

2 entries across 2 versions & 1 rubygems

Version Path
graphql-query-resolver-0.1.2 lib/graphql/query_resolver.rb
graphql-query-resolver-0.1.1 lib/graphql/query_resolver.rb