4

我有查询类型

Types::QueryType = GraphQL::ObjectType.define do
  name 'Query'

  field :allProjects, function: Resolvers::Projects
end

像这样的解析器

require 'search_object/plugin/graphql'

module Resolvers
  class Projects
    include SearchObject.module(:graphql)

    type !types[Types::ProjectType]

    scope { Project.all }

    ProjectFilter = GraphQL::InputObjectType.define do
      name 'ProjectFilter'

      argument :OR, -> { types[ProjectFilter] }
      argument :description_contains, types.String
      argument :title_contains, types.String
    end

    option :filter, type: ProjectFilter, with: :apply_filter
    option :first, type: types.Int, with: :apply_first
    option :skip, type: types.Int, with: :apply_skip

    def apply_first(scope, value)
      scope.limit(value)
    end

    def apply_skip(scope, value)
      scope.offset(value)
    end

    def apply_filter(scope, value)
      branches = normalize_filters(value).reduce { |a, b| a.or(b) }
      scope.merge branches
    end

    def normalize_filters(value, branches = [])
      scope = Project.all
      scope = scope.where('description ILIKE ?', "%#{value['description_contains']}%") if value['description_contains']
      scope = scope.where('title ILIKE ?', "%#{value['title_contains']}%") if value['title_contains']
      branches << scope

      value['OR'].reduce(branches) { |s, v| normalize_filters(v, s) } if value['OR'].present?
      branches
    end
  end
end

我想在解析器中访问 c​​urrent_user,这样我就可以访问 current_user.projects 而不是 Project.all。我对graphql和学习很陌生。

一切正常,但我只需要了解如何让解析器中的 ctx 变老的整个流程。

4

1 回答 1

5

首先,您需要current_user在上下文中设置。这发生在您的 GraphqlController 中。

class GraphqlController < ApplicationController
  before_action :authenticate_user!

  def execute
    variables = ensure_hash(params[:variables])
    query = params[:query]
    operation_name = params[:operationName]
    context = {
      current_user: current_user,
    }
    result = HabitTrackerSchema.execute(query, variables: variables, context: context, operation_name: operation_name)
    render json: result
  rescue => e
    raise e unless Rails.env.development?
    handle_error_in_development e
  end

  # ...
end

完成后,您current_user只需编写以下内容即可从查询(或突变)中访问:

context[:current_user]

为了使事情更简单,您可以向( ) 添加一个current_user方法,然后您就可以从这些方法中调用。Types::BaseObjectapp/graphql/types/base_object.rbcurrent_user#resolve

module Types
  class BaseObject < GraphQL::Schema::Object
    field_class Types::BaseField

    def current_user
      context[:current_user]
    end
  end
end
于 2020-03-31T14:55:53.643 回答