Rails / ActiveRecord Order with string vs symbol

时间:2017-01-28 19:02:53

标签: ruby-on-rails activerecord

我在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_byorder_direction被列入白名单,因此SQL注入不是问题。

2 个答案:

答案 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)