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, tips

Supongamos 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.

Code (ruby)
  1. def actualiza
  2.   params[:article_ids].each do |i|
  3.     articulo = Article.find( i )
  4.     articulo.status= "borrador"
  5.     articulo.save
  6.   end
  7. 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.

Code (sql)
  1. #
  2. SELECT * FROM articles WHERE (article.`id` = 1)
  3. UPDATE articles SET STATUS = ‘borrador’ WHERE id = 1

Una manera mucho más eficiente es usar Article.update_all

Code (ruby)
  1. def actualiza
  2.   Article.update_all( ["status = ?", ‘borrador’], :id => params[:article_ids] )
  3. 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.

Code (sql)
  1. UPDATE articles SET STATUS = ‘borrador’ WHERE (article.`id` IN (1,3,4,5,7))

Deja un comentario

XHTML: puedes usar estas etiquetas: <a href="" title=""> <abbr title=""> <acronym title=""> <b> <blockquote cite=""> <code> <em> <i> <strike> <strong>