我想通过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执行必要转义的优势)?
答案 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`