ruby - 我怎样才能让一个字段更新/更改另一个字段?

标签 ruby graphql graphql-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

然后在 resolve 中返回包含posts, total, page, 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

也可以定义一个对象并返回。 Wrapper::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])
    }
...

关于ruby - 我怎样才能让一个字段更新/更改另一个字段?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/52935158/

相关文章:

javascript - 为什么在这种情况下 markdownRemark 未定义?

reactjs - React Apollo GraphQL : Expecting a parsed GraphQL document. 也许您需要将查询字符串包装在 "gql"标签中?

ruby-on-rails - 在 graphql-ruby 中定义输入类型

ruby - 如何打印两个零的 00 作为整数?

javascript - Apollo Server gql使用推荐

ruby - 将 ruby​​ 和 ruby​​gems 移动到自定义路径中

ruby-on-rails - 处理业务代码中的 GraphQL Enum 值

ruby-on-rails - 无法使用 ActionCable 和 graphql-ruby gem 理解 GraphQL 订阅

ruby - 正则表达式匹配文本周围的字符

ruby - 在 View 中显示带有空格和其他符号的文件名