我在Rails Active Record查询中应用动态订单方法时遇到问题。按字段和方向的顺序是基于请求参数的动态。将它们指定为字符串时,它会在不明确的字段名称上被触发。指定为符号时,没关系。如何使用符号动态创建此查询?
这:
subject = subject.order('id desc')
SELECT DISTINCT "projects"."id", id AS alias_0 FROM...
中的结果,并发出PG::AmbiguousColumn: ERROR: column reference "id" is ambiguous
错误。
使用符号指定时,Active Record会正确地将它们放在一起而不会产生歧义:
subject = subject.order(id: :asc)
那么如何动态转换或使用此方法,例如:
subject = subject.order(params[:order_by] + ' ' + params[:order_direction])
附注:在查询的其他地方发生了连接和其他复杂性,我假设这个问题导致了问题(多个id
字段),但同样作为符号Active Record正确地计算出来。此外,上面的参数示例中的order_by
和order_direction
被列入白名单,因此SQL注入不是问题。
答案 0 :(得分:1)
您可以使用符号化键创建哈希:
order = {}
order[params[:order_by].to_sym] = params[:order_direction]
subject = subject.order(order)
不确定这会阻止AmbiguousColumn错误,但
答案 1 :(得分:0)
简短回答
subject = subject.order(params[:order_by].to_sym => params[:order_direction].to_sym)