rails命令参数化查询

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了rails命令参数化查询相关的知识,希望对你有一定的参考价值。

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

@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;")

将导致用户表被销毁。

答案

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

但接受像这样的哈希:

order(sort_column => sort_direction)

Rails Guides About Ordering

以上是关于rails命令参数化查询的主要内容,如果未能解决你的问题,请参考以下文章

带方法的 SQL 命令中的参数化查询

如何在 Rails 中清理 sql 片段

Rails 无法参数化西里尔字符(俄语)

计算光栅化片段的数量

ADO.NET 中参数化 SQL 命令的最终形式

操作栏选项卡:使用多次实例化的单个片段时如何传递参数