在Ruby中重用GraphQL参数

时间:2019-05-02 19:18:07

标签: ruby-on-rails ruby graphql

我正在使用Rails和graphql-ruby gem构建我的第一个GraphQL API。到目前为止,它非常简单而且很棒。

关于重复代码,我现在有点卡住了。我有一个项目管理Rails应用,其中包含空间,待办事项(它们属于空间),用户。

我想要实现的是能够查询空间及其待办事项,例如查询当前用户的所有待办事项。对于待办事项,我希望能够使用不同的参数对其进行过滤:

完成-布尔值, 范围-字符串(今天或thisWeek), 受让人-整数(用户的ID)

@SpringJUnitConfig(MyBean.class)

这意味着每次我获得待办事项时,我都希望能够过滤它们,无论它们是已完成还是在今天到期等。

我知道如何使用参数,并且一切正常,但是目前我一次又一次使用相同的编码器。每当我拥有相同的待办事项字段时,如何(在何处)提取该代码以使其可重用?

query {
  space(id: 5) {
    todos(done: false) {
      name
      done
      dueAt
    }
  }
}


query {
  me {
    todos(done: false, scope: today) {
      name
      done
      dueAt
    }
  }
}

1 个答案:

答案 0 :(得分:0)

好吧,就像@jklina也说过,我最终使用了自定义解析器。

我更改了:

field :todos, [TodoType], null: true do
  argument :done, Boolean, required: false
  argument :scope, String, required: false
  argument :limit, Integer, required: false
end

收件人:

field :todos, resolver: Resolvers::Todos, description: "All todos that belong to a given space"

并添加了一个解析器:

module Resolvers
  class Todos < Resolvers::Base
    type [Types::TodoType], null: false

    TodoScopes = GraphQL::EnumType.define do
      name "TodoScopes"
      description "Group of available scopes for todos"
      value "TODAY", "List all todos that are due to today", value: :today
      value "THISWEEK", "List all todos that are due to the end of the week", value: :this_week
    end

    argument :done, Boolean, required: false
    argument :scope, TodoScopes, required: false
    argument :limit, Integer, required: false
    argument :assignee_id, Integer, required: false

    def resolve(done: nil, scope:nil, limit:5000, assignee_id: nil)
      todos = object.todos

      # filtering the records...

      return todos.limit(limit)
    end
  end
end

非常简单!