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

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

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

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

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

Итак, предположим, что для моего запроса используется следующий тип рубина:

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
      ...
    }
  }
}
Пошаговое руководство по созданию собственного Slackbot: От установки до развертывания
Пошаговое руководство по созданию собственного Slackbot: От установки до развертывания
Шаг 1: Создание приложения Slack Чтобы создать Slackbot, вам необходимо создать приложение Slack. Войдите в свою учетную запись Slack и перейдите на...
6
0
145
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

Ответ принят как подходящий

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

Я хотел бы изменить определение запроса, потому что сообщения, общее количество, страница, на_страницу должны быть объединены по типу.

вот так: Типы :: 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

Затем верните объект в разрешении, который содержит сообщений, всего, страница, на_странице

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])
    }
...

Другие вопросы по теме