2017-01-28 6 views
0

Rails Active Recordクエリで動的順序付けメソッドを適用する際に問題があります。フィールドと方向による順序は、要求パラメータに基づいて動的です。それらを文字列として指定すると、あいまいなフィールド名でトリップされます。シンボルとして指定するときは、それは問題ありません。このクエリをシンボルで動的に作成するにはどうすればよいですか?Rails/ActiveRecord Order文字列対シンボルの問題

この:SELECT DISTINCT "projects"."id", id AS alias_0 FROM...

subject = subject.order('id desc') 

結果とPG::AmbiguousColumn: ERROR: column reference "id" is ambiguousエラーになります。

この使用してシンボルを指定する場合、アクティブレコードが正しく曖昧させずにすべて一緒にそれを置く:

subject = subject.order(id: :asc) 

それでは、どのように私は変換することができますまたは動的にこの方法を使用する、など:

subject = subject.order(params[:order_by] + ' ' + params[:order_direction]) 

サイド注:私は、問題(複数のidフィールド)に貢献していると仮定しているクエリの他の場所で起こっている結合や他の複雑さがありますが、再びアクティブレコードのシンボルとして、それはすべて適切に数字です。また、上記のparamsの例のorder_byorder_directionはホワイトリストに登録されているため、SQLインジェクションは問題になりません。

答えて

1

あなたはこのような記号化キーを持つハッシュを作成することができます。

order = {} 
order[params[:order_by].to_sym] = params[:order_direction] 
subject = subject.order(order) 

ない。これは、トリックを行います

+0

けれども、これは、AmbiguousColumnエラーを防ぐことができますことを確認してください、ありがとう! – Ryan