在不使用update_all和单个查询的情况下在rails中进行批量更新?

时间:2017-06-13 05:35:14

标签: sql ruby-on-rails activerecord

我想使用活动记录的单个查询来更新多行。我不必使用update_all,因为它会跳过验证。有没有办法在rails活动记录中执行此操作。?

3 个答案:

答案 0 :(得分:2)

使用 activerecord-import gem 可以实现不使用 update_all 的大规模更新。 有关详细信息,请参阅 this gem。 带有 detail 的方法。

示例: 假设有一个名为“Services”的表有一个“booked”列。我们想在循环外使用 gem 更新它的值。

services.each do |service| 
 service.booked = false 
 service.updated_at = DateTime.current if service.changed?
end


ProvidedService.import services.to_ary, on_duplicate_key_update: { columns: %i[booked updated_at] }

活动记录导入默认不更新“updated_at”列。所以我们必须明确更新它。

答案 1 :(得分:1)

如果您想在不实例化模型的情况下更新多个记录,则update_all方法应该可以解决问题:

使用给定的详细信息更新当前关系中的所有记录。此方法构造单个SQL UPDATE语句,并将其直接发送到数据库。它不会实例化所涉及的模型,也不会触发Active Record回调或验证。但是,传递给#update_all的值仍将通过Active Record的常规类型转换和序列化。

例如:

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

据我了解,它甚至接受一个数组作为参数,从而使我们能够提供不同的哈希值,以按照其相应顺序更新不同的记录,就像在SQL UPDATE语句中一样。纠正我,有人,如果我错了。

答案 2 :(得分:0)

听起来你正在寻找Update records - 来自文档更新多条记录;不同的col与不同的数据

你可以这样做:

people = { 1 => { "first_name" => "David" }, 2 => { "first_name" => "Jeremy" } }
Person.update(people.keys, people.values)