2011-10-07 7 views

risposta

25

Stai cercando update_all. See doc.

Attenzione, nessun richiamo viene attivato in questo modo.

+0

Grazie, questo è un modo molto più efficiente per farlo rispetto al ciclo di ogni elemento. – Ryan

+1

@Ryan è molto più efficiente ma la mancanza di callback rende la scelta difficile nella mia esperienza. Uno dei casi d'uso più comuni (tranne la pulizia dei dati, ecc. Nello sviluppo) è l'attivazione/disattivazione di massa delle entità. In genere, tale aggiornamento di dati merita di essere notificato agli utenti che di solito eseguo tramite callback;) –

34

questo dovrebbe funzionare

Notification.all.each do |n| n.update_attribute(:email, true); end 

edit: su misura da Bricker:

Notification.all.each { |n| n.update_attribute(:email, true) } 
+2

'Notification.all.each {| n | n.update_attribute (: email, true)} '- i punti e virgola non appartengono a Ruby. ;) – bricker

+0

'Notification.all.each {| n | n.update_attribute: email, vero} ' Né parentesi extra. ;) (Ed è anche possibile utilizzare il form 'do ... end' senza punto e virgola, perché' end' è (quasi) mai ambiguo: 'Notification.all.each do | n | n.update_attribute: email, true end' - ma senza evidenziare la sintassi questo è meno leggibile.) –

+1

Se hai più di una istruzione devi usare semi-punto, mi ci sono abituato in quel modo. – cbron

12

È possibile utilizzare:

Notification.update_all(email: true) 

Se avete qualsiasi condizione per l'aggiornamento si dovrebbe utilizzare :

Notification.find_each { |n| n.email = (n.id > 100) ? true : false } 

Utilizzare Something.all è una cattiva idea per l'enorme tabella db.

+0

Alcuni riferimenti http://api.rubyonrails.org/classes/ActiveRecord/Batches.html – makhan

4
Notification.update_all(email: true) 

è la risposta di base.

Non è necessario "eseguire il loop" di per sé scrivendo il proprio blocco: puoi lasciare che il record attivo svolga il duro lavoro per te - ecco un esempio di dove hai una serie di ID e vuoi aggiornare i propri messaggi di posta elettronica (ho praticamente preso questo esempio direttamente da uno dei miei controllori):

@notifications = Notification.where(id: [1,2,3,2,1,2]).update_all(email: true) 

Edit: la gente guardare fuori per SQL injection non includono un params [: notification_ids] nel metodo "dove" con un grezzo stringa senza fuggire o si soffriranno attacchi di iniezione sql; o sii sicuro e usa un hash.

Problemi correlati