Rails 3 + activerecord,为所有满足条件的记录"批量更新"单个字段的最佳方式

jpw*_*ynn 75 activerecord ruby-on-rails

在轨道3,使用ActiveRecord,是有一个单一查询的方式来设定:隐藏字段,TRUE对符合条件......也就是说,例如所有记录,:condition => [ "phonenum = ?", some_phone_number ]

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

Dog*_*ert 86

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

Model.update_all({ hidden: true }, { phonenum: some_phone_number})
Run Code Online (Sandbox Code Playgroud)

  • @ ctilley79,我认为这应该有效:`Model.where("date_create <?",a_certain_date).update_all(hidden:true)` (7认同)
  • 对于ex update_all({:hidden => true},{:date_created <a_certain_date})值小于某个值的情况怎么样?这可能吗? (2认同)

Dee*_*k N 86

update_all不允许rails 3中的条件.您可以使用scope和update_all的组合

Model.where(phonenum: some_phone_number).update_all(hidden: true)
Run Code Online (Sandbox Code Playgroud)

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

  • **这是错误的**.该页面上的"**提供任何选项**",根据方法列表上方的段落描述了可以放在`options`哈希中的各种选项.这不包括`update_all()`的`conditions`参数. (4认同)
  • 根据rails 4文档,上面提到的方法确实是要走的路 - http://apidock.com/rails/ActiveRecord/Relation/update_all - #在标题Book.where('title'中更新所有带有'Rails'的书籍LIKE?','%Rails%').update_all(作者:'大卫') (4认同)

Dor*_*ian 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
Run Code Online (Sandbox Code Playgroud)

然后:

Model.where(phonenum: some_phone_number).update_each(hidden: true)
Run Code Online (Sandbox Code Playgroud)