我想使用活动记录的单个查询来更新多行。我不必使用update_all,因为它会跳过验证。有没有办法在rails活动记录中执行此操作。?
答案 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)