动态值在正确传递到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
这需要对using System.Linq;
var进行手动清理,如果操作不正确可能会让SQL注入 - 我的问题是,是否有人有更强大的解决方案,不太依赖于手动清理?
答案 0 :(得分:-1)
与where子句不同,where条件将按原样传递给数据库并执行,select语句和order子句实际上不涉及任何逻辑部分将在数据库端执行,因此这里不需要卫生。传入的任何内容都将在稍后在ORM上处理,然后再发送到数据库。更糟糕的情况会给你一个非法的SQL。
答案 1 :(得分:-1)
由于您要传递的所有值都是表的列,我会通过检查模型的属性列表来清理它们,如下所示:
sort_by = YourModel.attribute_names.include?(query) ? query : 'some_fallback_column'