ActiveRecord::Base#update_all
Visita este artículo en http://www.estadobeta.com/2007/07/02/activerecordbaseupdate_all/
Por Ismael en Documentación, Ruby & Rails, artículos, tipsSupongamos que quieres modificar varios registros a la vez (por ejemplo cambiar el status de varios artículos de un Blog a “borrador”). En la interfaz seleccionas los artículos con checkboxes y envías un array de id’s a una acción en el controlador. Usas ese array para actualizar cada registro.
-
def actualiza
-
params[:article_ids].each do |i|
-
articulo = Article.find( i )
-
articulo.status= "borrador"
-
articulo.save
-
end
-
end
Aparte de ser mucho código para una operación simple, esto ejecuta dos sentencias SQL para cada artículo. Claramente un cuello de botella en términos de rendimiento.
-
#
-
SELECT * FROM articles WHERE (article.`id` = 1)
-
UPDATE articles SET STATUS = ‘borrador’ WHERE id = 1
Una manera mucho más eficiente es usar Article.update_all
-
def actualiza
-
Article.update_all( ["status = ?", ‘borrador’], :id => params[:article_ids] )
-
end
Además del SQL que efectúa la actualización, como segundo parámetro podemos pasar una o más id’s de los objetos a actualizar. Si pasamos un array de id’s, ActiveRecord genera el SQL apropiado, automáticamente, y actualiza todos los registros con una sencilla sentencia.
-
UPDATE articles SET STATUS = ‘borrador’ WHERE (article.`id` IN (1,3,4,5,7))
- Servicios:
- Comentarios RSS
- Menear!
- Del.icio.us
