ruby - 如何让一个字段更新/更改另一个字段?
问题描述
我想得到另一个字段解析的字段。
我有一个根据一些参数生成的列表,并想更新总字段
我的方法可能是不正确的。
显然,我试图避免重新运行相同的数据库查询并在查询字符串中向上传递过滤器级别。
因此,假设我的查询使用以下 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
...
}
}
}
解决方案
您想要的是返回带有总计、页面、每页的帖子,而无需重新运行数据库查询。
我想修改查询定义,因为posts、total、page、per_page 应该在类型中组合。
像这样:Types::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])
}
...
推荐阅读
- laravel - 如何在 laravel 5.7 中从 mandrill 获得邮件回复?
- android - 我无法使用 setDataSource 播放媒体文件
- c# - 如何在每一页上为表格的第一行应用相同的格式?
- python - 在 Python 中加载两个动态库实例
- javascript - 如何使用来自rest api json的jQuery Datatable插件?
- python - 尝试使用 VGG16 模型进行训练时出现“检查目标时出错”消息
- python - 通过给定的平稳向量计算马尔可夫链
- python - 如何从 python 中的 .wav 文件创建频谱图以解决音频分类问题
- java - Spring Boot:使用控制器调用 JSP 时出现 404 错误
- javascript - 如何在字符串的特定位置插入字母/数字?