ActiveRecord:在`select`或`order`调用中清理动态值

时间:2016-08-25 00:12:51

标签: ruby-on-rails postgresql activerecord rails-activerecord

动态值在正确传递到query = "Batman"语句后会自动清理,因此给定where('heroes.alias % :query', :query => query)

select

但是,orderselect("heroes.* SIMILARITY(heroes.alias, '#{query}') AS similarity")都没有提供类似的语法,只留下:

order("SIMILARITY(heroes.alias, '#{query}' ASC")

query

这需要对using System.Linq; var进行手动清理,如果操作不正确可能会让SQL注入 - 我的问题是,是否有人有更强大的解决方案,不太依赖于手动清理?

2 个答案:

答案 0 :(得分:-1)

与where子句不同,where条件将按原样传递给数据库并执行,select语句和order子句实际上不涉及任何逻辑部分将在数据库端执行,因此这里不需要卫生。传入的任何内容都将在稍后在ORM上处理,然后再发送到数据库。更糟糕的情况会给你一个非法的SQL。

答案 1 :(得分:-1)

由于您要传递的所有值都是表的列,我会通过检查模型的属性列表来清理它们,如下所示:

sort_by = YourModel.attribute_names.include?(query) ? query : 'some_fallback_column'