Rails 3 + Activerecord, der beste Weg, um ein einzelnes Feld für alle Datensätze, die eine Bedingung erfüllen, massenweise zu aktualisieren

75

In Rails 3 gibt es mithilfe von activerecord eine Möglichkeit, das Feld : hidden für alle Datensätze, die eine Bedingung erfüllen , mit TRIE auf TRUE zu setzen.:condition => [ "phonenum = ?", some_phone_number ]

Wenn eine einzelne Abfrage dies nicht kann, was ist der optimale Ansatz?

jpw
quelle

Antworten:

86

Verwenden Sie update_all mit dem optionalen zweiten Parameter für die Bedingung:

Model.update_all({ hidden: true }, { phonenum: some_phone_number})
Dogbert
quelle
2
Was ist mit dem Fall, dass ein Wert kleiner als ein bestimmter Wert für ex update_all ist ({: hidden => true}, {: date_created <a_certain_date}), ist dies möglich?
Ctilley79
7
@ ctilley79, ich denke, das sollte funktionieren:Model.where("date_create < ?", a_certain_date).update_all(hidden: true)
Dogbert
86

Das update_all erlaubt keine Bedingungen in Rails 3. Sie können die Kombination von scope und update_all verwenden

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

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

Deepak N.
quelle
4
Das ist falsch . Auf der Seite steht " Bereitstellen einer beliebigen Option " gemäß dem Absatz direkt über der Methodenliste, in dem die verschiedenen Optionen beschrieben werden, die in den optionsHash aufgenommen werden können. Dies beinhaltet nicht das conditionsArgument auf update_all().
Asherah
Ich stimme zu, dass er falsch liegt. Gemäß der API Avatar.update_all ['migrated_at =?', Time.now.utc] setzt ['migrated_at>?', 1.week.ago] migrated = jetzt, wo migrated_at innerhalb einer Woche ist.
Ctilley79
4
Gemäß der Dokumentation zu Rails 4 ist die oben vorgeschlagene Methode in der Tat der richtige Weg - apidock.com/rails/ActiveRecord/Relation/update_all - # Aktualisieren Sie alle Bücher mit 'Rails' in ihrem Titel Book.where ('title LIKE?', '% Rails%'). Update_all (Autor: 'David')
JAR.JAR.beans
5

Wenn Sie Rückrufe auslösen möchten:

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

Dann:

Model.where(phonenum: some_phone_number).update_each(hidden: true)
Dorian
quelle