如何对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
}
}
}
答案 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子查询到数据库查询的映射。