ActiveRecord Hash表单说update_all(“prio = prio + 200”)

时间:2014-01-30 11:10:12

标签: sql ruby-on-rails ruby activerecord

我想通过update_all更改大量记录的属性。 用户应该能够相对更改prio(记录1有prio 0,记录2 prio 200,用户可以选择给他们+200,所以他们分别得到prio 200和400)。 同时更改其他列。 rails中的首选方式是

Model.update_all(name: name)

但对于prio我只有我现在知道的字符串形式 -

Model.update_all("prio = prio + #{change_of_prio}")

如何将后者更改为rails的Hash-Form?或者,如何在一个update_all语句中执行这两个操作(在使用哈希调用它时不会失去rails执行必要转义的优势)?

2 个答案:

答案 0 :(得分:1)

您必须使用数组表示法。这可行:

Model.update_all(["prio = prio + :change_of_prio, name = :name", {change_of_prio: 200, name: "foo"}])
# UPDATE `models` SET prio = prio + 200, name = 'foo'

:change_of_prio:name被命名为占位符,引用散列中的相应值。 Rails为你处理逃逸。

答案 1 :(得分:0)

可以在枚举器上应用#update_all来设置或更新具有指定值的所有记录。 The examples

# Update all customers with the given attributes
Customer.update_all wants_email: true

# Update all books with 'Rails' in their title
Book.where('title LIKE ?', '%Rails%').update_all(author: 'David')

# Update all books that match conditions, but limit it to 5 ordered by date
Book.where('title LIKE ?', '%Rails%').order(:created_at).limit(5).update_all(author: 'David')

因此,在您的情况下,调用将使用name变量的相同值更新所有记录,该变量将作为参数传递给函数。

Model.update_all(name: name) # all columnt named 'name' will have value of variable `name`

至于prio

prio = ...
change_of_prio = ...
Model.update_all(prio: "#{prio} #{change_of_prio}") # all columnt named 'prio' will have value of variable concat `prio` and `change_of_prio`