Как я могу обновить или изменить другое поле?

Я бы хотел, чтобы поля были разрешены другим полем.

У меня есть список, сгенерированный в соответствии с некоторыми аргументами, и хотел бы обновить полное поле

Мой подход, вероятно, неверен.

Очевидно, я пытаюсь избежать повторного запуска одного и того же запроса базы данных и передачи фильтра уровня в строке запроса.

Поэтому предположим, что для моего запроса следующий тип ruby:

Types::PostListType = GraphQL::ObjectType.define do
    name 'PostList'

    field :total, !types.Int, default_value: 0 # <-- this is what I'd like to update in :posts resolution
    field :page, !types.Int, default_value: 0 # <-- this is what I'd like to update in :posts resolution
    field :per_page, !types.Int, default_value: 0 # <-- this is what I'd like to update in :posts resolution

    field :posts, types[Types::PostType] do
        argument :page, types.Int, default_value: 1
        argument :per_page, types.Int, default_value: 10 # <-- also need a limit here (hence why I need a field to tell what's been used in the end)
        argument :filter, types.String, default_value: ''
        resolve ->(user, *_args) {
            posts = function_to_filter(args[:filter])
            # how do I update total with posts.count here?
            posts.paginate(page: args[:page], per_page: args[:per_page])
            # how do I update per_page and page?
        }
    end

end

Мой запрос выглядит примерно так:

query ProspectList {
  posts(filter:"example", page: 2) {
    total
    page
    per_page
    posts {
      id
      ...
    }
  }
}

Всего 2 ответа


То, что вы хотите, это возвращать сообщения с общей, страницей, per_page без повторного запуска запроса базы данных.

Я хотел бы изменить определение запроса, потому что сообщения, total, page, per_page следует комбинировать в типе.

Вот так : Типы :: PostListType

Types::PostListType = GraphQL::ObjectType.define do
  name 'PostList'

  field :total, !types.Int
  field :page, !types.Int
  field :per_page, !types.Int
  field :posts, types[Types::PostType]
end

Затем возвращайте объект в разрешении, который содержит сообщения, общее количество, страницу, per_page

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

  field :postlist, Types::PostListType do
    argument :page, types.Int, default_value: 1
    argument :per_page, types.Int, default_value: 1
    argument :filter, types.String
    resolve ->(_obj, args, _ctx) {
      result = Post.paginate(page: args[:page], per_page: args[:per_page])
      Posts = Struct.new(:posts, :page, :per_page, :total)
      Posts.new(
        result,
        args[:page],
        args[:per_page],
        result.total_entries
      )
    }
  end
end

Также возможно определить объект и вернуть его. Упаковочный :: PostList

module Wrapper
  class PostList
    attr_accessor :posts, :total, :page, :per_page
    def initialize(posts, page, per_page)
      @posts = posts
      @total = posts.total_entries
      @page = page
      @per_page = per_page
    end
  end
end

...
  field :postlist, Types::PostListType do
    argument :page, types.Int, default_value: 1
    argument :per_page, types.Int, default_value: 1
    argument :filter, types.String
    resolve ->(_obj, args, _ctx) {
      Wrapper::PostList.new(Post.paginate(page: args[:page], per_page: args[:per_page]), args[:page], args[:per_page])
    }
...

Из спецификации :

Обычно исполнитель может выполнять записи в сгруппированном поле, установленном в любом порядке, который он выбирает (обычно параллельно). Поскольку разрешение полей, отличных от полей мутации верхнего уровня, должно всегда быть свободным от побочных эффектов и идемпотентным, порядок выполнения не должен влиять на результат, и, следовательно, сервер имеет право выполнять записи полей в любом порядке, который он считает оптимальным.

Другими словами, за исключением полей типа Mutation , каждое поле в типе разрешается независимо. Решитель не может знать, что разрешили другие поля, потому что разрешители этих полей все еще могут работать одновременно.

Это означает, что вы должны переместить логику функций решения на один уровень выше, в любое поле, на самом деле возвращающее PostListType . Этот резольвер (предположительно для некоторого поля в типе Query ) будет извлекать всю информацию, необходимую для заполнения полей PostList и возврата полного объекта PostList . В этот момент вам не нужно будет указывать разрешатели для любого из полей в PostList поскольку поведение распознавателя по умолчанию будет достаточным.


Есть идеи?

10000