2013-02-14 12 views

risposta

39

È possibile utilizzare update_all come segue:

User.where(:id => user.id).update_all({:field1 => true, :field2 => true}) 

Questo genererà la seguente dichiarazione di aggiornamento (mysql):

UPDATE users SET field1 = 1, field2 = 1 WHERE users.id = <whatever> 

Le chiamate e le convalide non verranno eseguite.

+0

Se il vostro obiettivo è quello di aggiornare il record senza modificare il campo updated_at, questo non funzionerà. Altrimenti, è la strada da percorrere. –

1

quello di fare in questo modo:

user.attributes = attributes 
user.save(validate: false) 
0

Se hai bisogno di velocità puoi chiamare anche eseguire direttamente sulla connessione AR. Ho usato qualcosa di simile per importare grandi quantità di dati.

connection = ActiveRecord::Base.connection 
email = connection.quote(email) 
zip = connection.quote(zip) 
connection.execute(%{UPDATE "users" SET "email" = #{email}, "zip" = #{zip} WHERE "users"."id" = #{user.id}}) 

Si noti che le convalide e le richiamate non verranno eseguite.

copiato da https://stackoverflow.com/a/25171127/1520775

1

È possibile farlo in questo modo:

update_columns(field1: value, filed2: value) 
+2

disponibile solo in activerecord v4.0.2 e versioni successive: http://apidock.com/rails/ActiveRecord/Persistence/update_columns – ckbhodge

+0

questo aggiorna solo il singolo record a differenza di 'update_all' ma salta l'aggiornamento di' updated_at' e callbacks – carbonr