Как мне обновить / изменить одно поле?
Я хотел бы получить разрешение полей другим полем.
У меня есть список, созданный в соответствии с некоторыми аргументами и хотел бы обновить общее поле
Мой подход, вероятно, неверен.
Очевидно, я пытаюсь избежать повторного выполнения одного и того же запроса к базе данных и передачи фильтра на уровень выше в строке запроса.
Итак, предположим следующий тип 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 без повторного выполнения запроса к базе данных.
Я хотел бы изменить определение запроса, потому что сообщения, итоги, страницы, 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
в качестве поведения решателя по умолчанию будет достаточно.