【问题标题】:How can I have one field updating/changing another one?如何让一个字段更新/更改另一个字段?
【发布时间】:2018-10-22 17:59:55
【问题描述】:

我想获得由另一个字段解析的字段。

我有一个根据一些参数生成的列表,想更新总字段

我的方法可能不正确。

显然,我试图避免重新运行相同的数据库查询并在查询字符串中向上传递过滤器。

所以假设我的查询使用以下 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
      ...
    }
  }
}

【问题讨论】:

    标签: ruby graphql graphql-ruby


    【解决方案1】:

    您想要的是返回包含总页数、页数、每页的帖子,而无需重新运行数据库查询。

    我想修改查询定义,因为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
    

    然后在解析中返回对象,其中包含 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])
        }
    ...
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2019-11-18
      • 1970-01-01
      • 1970-01-01
      • 2015-04-29
      • 2020-06-05
      • 1970-01-01
      • 1970-01-01
      • 2022-12-12
      相关资源
      最近更新 更多