75 votes

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

Dans les rails 3, en utilisant l'activeecord, existe-t-il un moyen simple de définir le paramètre :caché pour VRAI pour tous les enregistrements qui répondent à une condition ... disons, par exemple, :condition => [ "phonenum = ?", some_phone_number ]

Si une seule requête ne suffit pas, quelle est l'approche optimale ?

87voto

Dogbert Points 44003

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

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

2 votes

Qu'en est-il du cas où une valeur est inférieure à une certaine valeur par exemple update_all( { :hidden => true }, { :date_created < a_certain_date }) est-ce possible ?

7 votes

@ctilley79, je pense que cela devrait fonctionner : Model.where("date_create < ?", a_certain_date).update_all(hidden: true)

87voto

Deepak N Points 1493

Le update_all ne permet pas les conditions dans les rails 3. Vous pouvez utiliser une combinaison de scope et de update_all.

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

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

4 votes

C'est faux. . La page dit " en fournissant n'importe quelle option ", par le paragraphe juste au-dessus de la liste des méthodes décrivant les différentes options qui peuvent être placées dans le champ options haché. Cela n'inclut pas le conditions argument sur update_all() .

0 votes

Je suis d'accord qu'il a tort. Selon l'API, Avatar.update_all ['migrated_at = ?', Time.now.utc], ['migrated_at > ?', 1.week.ago] définira migrated = now lorsque migrated_at est dans une semaine.

4 votes

Selon la documentation de rails 4, la méthode suggérée ci-dessus est en effet la meilleure solution. apidock.com/rails/ActiveRecord/Relation/update_all - # Mettre à jour tous les livres ayant 'Rails' dans leur titre Book.where('title LIKE ?', '%Rails%').update_all(author : 'David')

5voto

Dorian Points 2384

Si vous voulez déclencher des callbacks :

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)

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X