【发布时间】:2019-02-08 04:29:45
【问题描述】:
我尝试在 Rails 中创建一个 API,该 API 可以动态调用以返回不同时间段内数据的最小值/最大值/平均值。 我有一些这样的范围:
scope :span, ->(span) { group("date_round_down(device_time, '#{span}')::timestamp without time zone") }
scope :func, ->(func) { calculate("#{func}", 'point_data_val') }
但是 group 方法不允许我做 params and ?像 'where' 这样的替换。
有没有一种安全的方法可以在 Rails 中将参数放入 SQL 字符串的中间?
【问题讨论】:
-
这对于
.where也不起作用,因为占位符已转义,因此它不能用作列名。以.where('? = 1', 'id')为例。我会考虑改用白名单并用它来构造 SQL 字符串。 -
你选择了错误的方法,
scope返回一个值数组,尝试一个简单的方法定义。 -
实际上范围只是声明类方法@Зелёный的语法糖。你可以返回任何你想要的东西,例如
scope :foo, -> { "bar" }。当然,这样做会很愚蠢。它通常用于返回ActiveRecord::Relation对象而不是数组。
标签: ruby-on-rails sql-injection