Ruby GraphQL中SearchObject的order_by参数顺序不符问题求助
解决SearchObject + GraphQL中order_by参数顺序不符的问题
问题根源
你遇到的排序顺序颠倒的问题,核心原因在于GraphQL InputObject 的 arguments 属性返回的哈希是按照你定义字段的顺序排列的,而不是用户查询时传入的顺序。
看你的 LinksOrderBy 定义:created_at、description、id... 这里 description 字段在 id 之前,所以当你调用 value.arguments.to_h 时,会先取出 description 的值,再取出 id 的值,最终生成的排序语句自然和你查询传入的 {id: asc, description: desc} 顺序相反。
修复方案
要获取用户传入参数的原始顺序,你需要改用 GraphQL-Ruby 提供的 to_unsafe_h 方法,它会保留用户查询时传入的参数顺序:
def apply_order_by(scope, value) # 用 to_unsafe_h 替代 arguments.to_h,获取原始传入顺序的哈希 order_string = value.to_unsafe_h.map { |field, direction| "#{field} #{direction}" }.join(', ') scope.order(order_string) end
原理说明
value.arguments.to_h:GraphQL-Ruby 会按照 InputObject 定义时的字段顺序来组织这个哈希,目的是保证结构一致性,但这就忽略了用户传入的顺序。value.to_unsafe_h:这个方法直接返回用户查询时提交的原始参数哈希(Ruby 2.1 及以上版本的哈希默认保留插入顺序),这样就能完全按照用户指定的排序优先级生成 SQL 语句。
可选调试验证
如果想确认两种方式的差异,可以在方法里加个调试输出:
def apply_order_by(scope, value) puts "按定义顺序的哈希:#{value.arguments.to_h.inspect}" puts "用户传入顺序的哈希:#{value.to_unsafe_h.inspect}" # ... 排序逻辑 end
执行你的查询后,就能清晰看到两者的顺序区别,验证修复是否符合预期。
内容的提问来源于stack exchange,提问作者Arthur Felipe
相关产品推荐
相关产品推荐

