Как определить несколько запросов с одним и тем же именем для проекта Rails и GraphQL? - PullRequest
3 голосов
/ 20 сентября 2019

Вот некоторый контекст: я использую Rails 5.1.4, Ruby 2.6.1 и GraphQL 1.9.Мой Rails-проект в настоящее время сконфигурирован как проект REST API только.Однако я начинаю конвертировать его в использование GraphQL.После запуска связанных с графиком генераторов у меня в настоящее время есть файл graphql_controller.rb и файл query_type.rb.

Для моей модели базы данных у меня есть модель SchoolCourse, которая описывает конкретный курс, преподаваемый в колледже.Для этой модели я определил school_course_type.rb.В моем файле query_type.rb я определил поле для запроса schoolCourse.

Однако есть два типа пользователей, которые могут войти в мое приложение - учителя и студенты.Если пользователь является учителем, то при доступе к приложению и запросе schoolCourse будут возвращены все школьные курсы, которые преподает этот конкретный инструктор.Если пользователь является студентом, то при доступе к приложению и запросе schoolCourse будут возвращены все школьные курсы, которые посещает данный конкретный студент.В обоих случаях данные schoolCourse имеют один и тот же тип (school_course_type).

В настоящее время у меня есть запрос schoolCourse, определенный в query_type.rb для работы с учителями.Однако, если я хочу расширить запрос schoolCourse, чтобы он работал и для студентов, похоже, что мне придется обновить запрос schoolCourse, чтобы включить логику if / else, чтобы она выглядела примерно так:

# This is how it currently looks like:

def schoolCourses
  teacher_user = context[:current_user]
  teacher_user.school_courses
end


# This is how I think it would change:

def schoolCourses
  user = context[:current_user]

  if user.type == 'teacher'
    user.school_courses
  else
    # different way for students to retrieve school courses
  end
end

Хотя это может сработать, это не идеально. Основная проблема, которую я хочу решить, - это определить несколько schoolCourse запросов и сделать так, чтобы учителя использовали одну версию, а учащиеся использовали другую версию.

В моем текущем приложении яу меня есть 2 schoolCourse контроллеров - один для учителей и один для студентов, и если разбить его на два файла, мой API станет намного чище. Есть ли способ сделать что-то похожее с файлом query_type.rb, где у меня есть тип запроса для учителей и другой для студентов? Как вы решали эту проблему в своих проектах?

Добавление дополнительного контекста - 20.09.2009 14:10 PST

  1. Как школьные курсы различаются между учеником и учителем? Итак, объекты школьного курсаодинаковы для студентов и преподавателей.В настоящее время в моем RESTful бэкэнде у меня есть 2 отдельных файла контроллера для получения курсов для студентов.Один для учителей, а другой для студентов.Когда вызывается диспетчер школьных курсов учителя, он возвращает школьные курсы только зарегистрированному учителю.Аналогичным образом, когда вызывается диспетчер школьного курса ученика, он возвращает школьные курсы только зарегистрированному ученику.

  2. Можете ли вы объяснить, почему вы хотите иметь несколько школьных курсов?запросы? Причина, по которой я думаю, что мне нужно несколько запросов школьного курса, заключается в том, что я не хочу добавлять if / else логику в запрос одного школьного курса, чтобы сделать что-то для учителей и что-то еще для учащихся.Я знаю, что это сработает, но у меня, вероятно, есть 50 других моделей, и мне не нужно помещать в каждый запрос один и тот же тип логики if / else.

1 Ответ

0 голосов
/ 20 сентября 2019

Нужна дополнительная информация о том, как школьные курсы различаются между учеником и учителем.Можете ли вы объяснить, почему вы хотите иметь несколько запросов на школьные курсы?

Вы можете определить с помощью интерфейса:

Типы станут примерно такими:

module Types
  module Output
    StudentCourse = GraphQL::ObjectType.define do
      name "StudentCourse"

      interfaces [CourseInterface]

      field :student_specific_field, Types::Output::SpecificField

    end
  end
end

module Types
  module Output
    TeacherCourse = GraphQL::ObjectType.define do
      name "TeacherCourse"

      interfaces [CourseInterface]

      field :teacher_specific_field, Types::Output::SpecificField

    end
  end
end

module Types
  module Output
    CourseInterface = GraphQL::InterfaceType.define do
      name "Course"

      resolve_type lambda { |context, obj, _|
        case context[:user].type?
        when student
          Types::Output::StudentCourse
        when teacher
          Types::Output::TeacherCourse
        else
          raise Types::CantResolveType, "can't resolve type: #{obj.class}"
        end
      }

      field :id, !types.ID
    end
  end
end
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...