Rails 3 + activerecord,对满足条件的所有记录“批量更新”单个字段的最佳方法


75

在rails 3中,使用activerecord,是否存在一种单查询方式,可将所有满足条件的记录的:hidden字段设置为TRUE ...例如,:condition => [ "phonenum = ?", some_phone_number ]

如果单个查询无法做到,那么最佳方法是什么?

Answers:


86

update_all与可选的第二个参数一起用于条件:

Model.update_all({ hidden: true }, { phonenum: some_phone_number})

2
如果ex update_all({:hidden => true},{:date_created <a_certain_date})的值小于某个特定值,该怎么办?
ctilley79 2012年

7
@ ctilley79,我认为这应该有效:Model.where("date_create < ?", a_certain_date).update_all(hidden: true)
Dogbert 2012年

86

update_all不允许在rails 3中使用条件。您可以结合使用scope和update_all

Model.where(phonenum: some_phone_number).update_all(hidden: true)

参考:http//m.onkey.org/active-record-query-interface


4
这是错的。在方法列表上方的段落中,页面描述了“提供任何选项”,描述了可以在options哈希表中使用的各种选项。这不包括上的conditions参数update_all()
Asherah

我同意他错了。根据API Avatar.update_all ['migrated_at =?',Time.now.utc],['migrated_at>?',1.week.ago]将设置migrated = now,其中migrated_at在一周之内。
ctilley79

4
根据rails 4文档,以上建议的方法确实是可行的方法-apidock.com/rails/ActiveRecord/Relation/update_all-# 更新标题为Book.where('title like ?,' '%Rails%')。update_all(作者:'David')
JAR.JAR.beans 2014年

5

如果要触发回调:

class ActiveRecord::Base
  def self.update_each(updates)
    find_each { |model| model.update(updates) }
  end

  def self.update_each!(updates)
    find_each { |model| model.update!(updates) }
  end
end

然后:

Model.where(phonenum: some_phone_number).update_each(hidden: true)
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.