rails命令参数化查询

问题描述 投票:0回答:1

我知道订单不安全,所以我想重构这段代码:

@tasks = @search.result.joins(user_application_status: {student_application: [student_profile: :student]})
                       .order(sort_column + ' ' + sort_direction).page(params[:page])

sort_column直接从params读取并且会像user_application_tasks.namesort_direction那样返回像asc那样的东西,我试着将它重构为:

.order("? ?", sort_column, sort_direction).page(page_params)

但是我收到了一个错误

ActiveRecord::StatementInvalid - PG::SyntaxError: ERROR:  syntax error at or near ","
LINE 1: ...HERE (application_statuses.id = 137)  ORDER BY ? ?, user_app...

我之前做过类似的事情

Thing.where("state = ?" ,params[:state])

我省略了一些特殊的语法吗?

编辑:

我最担心的是有人能够在这里注入sql并做一些有害的事情,因为@spickermann提到订单不会清理数据所以

Thing.order("name; drop table users;")

将导致用户表被销毁。

sql ruby parameters ruby-on-rails-4.2
1个回答
2
投票

order在像where这样的列表中提供属性时不会清理属性。

但接受像这样的哈希:

order(sort_column => sort_direction)

Rails Guides About Ordering

© www.soinside.com 2019 - 2024. All rights reserved.