【发布时间】:2016-09-27 21:05:11
【问题描述】:
我在我的应用程序中做了很多时间没有日期查询,我想抽象一些查询。
假设我有一个带有DateTime starts_at 字段的模型:
Shift.where('starts_at::time > ?', '20:31:00.00')
-> SELECT "shifts".* FROM "shifts" WHERE (starts_at::time > '20:31:00.00')
这会正确返回所有大于时间 20:31 的 'starts_at' 值。
我想动态地将列名传递到查询中,所以我可以这样做:
Shift.where('? > ?', "#{column_name}::time", '20:31:00.00').
-> SELECT "shifts".* FROM "shifts" WHERE ('starts_at::time' > '20:31:00.00')
在此示例中,这不起作用,因为搜索将 starts_at::time 作为字符串执行,而不是作为具有 time 转换的列。
如何安全地将column_name 传递到带有::time 演员的查询中?虽然这不会接受用户输入,但我仍然希望确保考虑到 SQL 注入。
【问题讨论】:
-
您尝试使用像
query_text = " start_at > ?"这样的临时变量,然后使用Shift.where( query_text , '20:31:00.00')? -
@inye 但问题是他不一定知道
column_name就是'start_at',理论上列名可以是'pancakes house',所以需要引用/escaped,然后才能发送到数据库。 -
当你知道
column_name?也许你可以有一些if else分配query_text
标签: ruby-on-rails postgresql activerecord rails-activerecord