ruby-on-rails - ActiveRecord:清理 `select` 或 `order` 调用中的动态值

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

当正确传递到 where 语句时,动态值会自动清理,因此给定 query = "Batman":

where('heroes.alias % :query', :query => query)

但是,selectorder 都没有提供类似的语法,因此我们可以:

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/

相关文章:

ruby-on-rails - 在 Windows 上安装 Ruby 版本 2.2.3 - 获取 config.yml

postgresql - Redshift 并发交易

ruby-on-rails - 0 大小关联的 Rails Scope

ruby-on-rails - 开始使用 MiniTest 和 Rails

ruby-on-rails - Rails - 发送带有名称的电子邮件不起作用

javascript - 在 html.erb 中用 JavaScript 调用我的模型

database - 无法连接到 Postgres

Postgres-XL 9.5 集群与单个 PostgreSQL 9.5 的性能对比

ruby-on-rails - 通过关联的属性值对集合进行排序的数据库查询

ruby-on-rails - 基于用户参数的 Rails 中的不同数据库连接