come posso aggiornare una tabella Notification.email a true in console?In Rails Console. come aggiornare un campo per tutti i record?
In console, vorrei scorrere tutti i record della tabella e impostare email = true.
Idee?
come posso aggiornare una tabella Notification.email a true in console?In Rails Console. come aggiornare un campo per tutti i record?
In console, vorrei scorrere tutti i record della tabella e impostare email = true.
Idee?
Stai cercando update_all
. See doc.
Attenzione, nessun richiamo viene attivato in questo modo.
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) }
'Notification.all.each {| n | n.update_attribute (: email, true)} '- i punti e virgola non appartengono a Ruby. ;) – bricker
'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.) –
Se hai più di una istruzione devi usare semi-punto, mi ci sono abituato in quel modo. – cbron
È 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.
Alcuni riferimenti http://api.rubyonrails.org/classes/ActiveRecord/Batches.html – makhan
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.
Grazie, questo è un modo molto più efficiente per farlo rispetto al ciclo di ogni elemento. – Ryan
@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;) –