当正确传递到 where
语句时,动态值会自动清理,因此给定 query = "Batman"
:
where('heroes.alias % :query', :query => query)
但是,select
和 order
都没有提供类似的语法,因此我们可以:
select("heroes.* SIMILARITY(heroes.alias, '#{query}') AS similarity")
和
order("SIMILARITY(heroes.alias, '#{query}' ASC")
这需要对 query
var 进行手动清理,如果操作不当,可能会导致 SQL 注入(inject) - 那么我的问题是,是否有人有更强大的解决方案,减少了对手动清理的依赖?
最佳答案
由于您要传递的所有值都是表的列,因此我会通过检查模型的属性列表来清理它们,如下所示:
sort_by = YourModel.attribute_names.include?(query) ? query : 'some_fallback_column'
关于ruby-on-rails - ActiveRecord:清理 `select` 或 `order` 调用中的动态值,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/39134825/