web-dev-qa-db-fra.com

Rails 3 + activerecord, la meilleure façon de "mettre à jour en masse" un seul champ pour tous les enregistrements qui remplissent une condition

Dans Rails 3, en utilisant activerecord, existe-t-il une méthode à requête unique pour définir le champ : caché sur TRUE pour tous les enregistrements qui remplissent une condition ... par exemple, :condition => [ "phonenum = ?", some_phone_number ]

Si une seule requête ne peut pas le faire, quelle IS l'approche optimale?

76
jpwynn

Utilisez pdate_all avec le deuxième paramètre facultatif pour la condition:

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

Update_all n'autorise pas les conditions dans Rails 3. Vous pouvez utiliser la combinaison de scope et update_all

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

Référence: http://m.onkey.org/active-record-query-interface

86
Deepak N

Si vous souhaitez déclencher des rappels:

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

Ensuite:

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