【问题标题】:Rails - How to properly escape values in a update_all queryRails - 如何在 update_all 查询中正确转义值
【发布时间】:2015-04-20 16:40:00
【问题描述】:

所以我有一个如下所示的 update_all 查询:

Task.where(...).update_all('position = position - X, parent_id = Y')

我想用整数值替换 X 和 Y。我想安全地做到这一点:“铁路方式”。 知道如何实现这一目标吗?


编辑:我的 rails 控制器中没有位置变量。如果 X = 1,则最终查询应按字面意思包含“position=position-1”。

另外,update_all documentation 指定此方法只接受一个参数:表示 SQL 语句的 SET 部分的字符串、数组或散列。


编辑 2:好的,我通过稍微调整 Arup Rakshit 解决方案使其工作。这是最终的工作解决方案:

Task.update_all(['position = position - ?, parent_id = ?', X, Y])

【问题讨论】:

  • 假设 X= 2, Y = 3 然后Task.where(...).update_all('position = position - #{X}, parent_id = #{Y}')
  • 已更新..请尝试..它会工作。

标签: sql ruby-on-rails escaping sql-injection


【解决方案1】:

写成:

Task.where(...)
    .update_all(['position = ?, parent_id = ?', position - X, Y])

阅读update_all

条件 - 一个 SQL 片段,例如“administrator = 1”或 [“user_name = ?”, username ]。有关详细信息,请参阅介绍中的条件。

演示:

Loading development environment (Rails 4.2.0)
[1] pry(main)> Person.pluck(:name, :email)
   (0.4ms)  SELECT "people"."name", "people"."email" FROM "people"
=> [["xxxx", nil], ["xxxx", nil], ["xxxx", nil]]
[3] pry(main)> Person.where(email: nil).update_all ["name = ?, email = ?", "foo", "test@test.com"]
  SQL (0.7ms)  UPDATE "people" SET name = 'foo', email = 'test@test.com' WHERE "people"."email" IS NULL
=> 3
[4] pry(main)> Person.pluck(:name, :email)
   (0.3ms)  SELECT "people"."name", "people"."email" FROM "people"
=> [["foo", "test@test.com"], ["foo", "test@test.com"], ["foo", "test@test.com"]]
[5] pry(main)>

【讨论】:

  • opps 我想我迟到了几秒钟。 :P
  • Model.update_all("position = 'position - X', parent_id = 'Y' ") 这个呢?
  • @Sontya 我懒得处理 SQL 注入,所以让 Rails 在内部完成这项工作。 :-)
  • 您好,谢谢您的回复。但是 rails 会抛出错误数量的参数错误。根据文档:apidock.com/rails/ActiveRecord/Relation/update_all Updates 属性是唯一的参数,并且是“表示 SQL 语句的 SET 部分的字符串、数组或哈希”
  • 另外,我不知道我是否一开始就说清楚了,但是我的rails代码中没有位置变量。通过说 position=position-1,我希望位置列将其值减 1。
【解决方案2】:

尝试这样做:

Task.where(...).update_all("position = ?, parent_id = ?",position - X, Y )

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-10-20
    • 2011-08-08
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多