如何在graphql ruby​​中的嵌套字段上排序?

时间:2019-02-18 15:35:41

标签: ruby graphql

如何对graphql-ruby中的嵌套字段(或虚拟属性)进行排序?

ExampleType = GraphQL::ObjectType.define do
   name 'Example'
   description '...'
   field :nested_field, NestedType, 'some nested field' do
       // some result that is virtually calculated and returns
       OpenStruct.new(a: 123//some random number, b: 'some string')
   end
end

QueryType = GraphQL::ObjectType.define do
    name 'query'
    field: example, ExampleType do
    resolve -> (_obj, args,_ctx) {
            Example.find(args['id']) //Example is an active record
        }
    end

    field: examples, types[ExampleType] do
        resolve -> (_obj, args,_ctx) {
            // NOTE: How to order by nested field here? 
            Example.where(args['id'])
        }
    end
end

如果我要获取nested_field.a排序的示例列表:

query getExamples {
    examples(ids: ["1","2"], order: 'nested_field.a desc') {
        nested_field {
             a
        }
    }
}

1 个答案:

答案 0 :(得分:0)

您无法通过virtual attribute对活动记录进行排序,因为活动记录无法将此virtual attribute与SQL / NoSQL查询进行匹配。您可以通过在数据库层创建视图来避免限制。在GraphQL中,排序/分页应在DB层上实现。如果没有这种排序/分页实现,则会将所有数据从数据库查询到应用程序内存。

此外,我还建议您根据枚举从具有字符串类型的order参数切换到具有sort类型的[SearchSort!]参数。 GraphQL模式如下所示:

input SearchSort {
  sorting: Sorting!
  order: Order = DESC
}

enum Sorting {
  FieldName1
  FieldName2
}

enum Order {
  DESC
  ASC
}

它可以帮助您实现从GraphQL子查询到数据库查询的映射。