Dagi3d v4

Ocultando objetos en Ruby On Rails: acts_as_invisible

Durante el desarrollo de la aplicación que mencioné en el último post, se me planteó un nuevo 'problema' y es que necesitaba que desde el propio programa se pudieran borrar registros pero que realmente no se eliminaran de la base de datos, si no que simplemente desaparecieran de cara a la aplicación. En principio esto era tan sencillo de solucionar como añadir un nuevo atributo a la clase a modo de flag y añadir una nueva condición a la hora de buscar los objetos dentro del controlador:

Document.find(:all, :conditions => ["visible = ?", true])
Document.find(id, :conditions => ["visible = ?", true])

# "borrando" el objeto
document.visible = false
document.save

Esto funcionaba, pero me parecía un tanto engorroso tener que añadir una condición extra a la hora de hacer las búsquedas y borrar en todas las clases que quería que fuesen 'ocultables'. Así que por aquello de seguir con la filosofía del DRY e indagar un poco en el core de Rails, hice un sencillo plugin que añadía esta funcionalidad de manera transparente y sin necesidad de tocar el código ya existente del controlador. Así, tan sólo habría que marcar la clase del modelo con el método 'acts_as_invisible' (Se da por hecho que existe una columna de tipo booleano llamada 'visible' en la tabla asociada a la clase):

class Document < ActiveRecord::Base

acts_as_invisible

end

Y a la hora de trabajar con el modelo, se haría de la siguiente manera:

# recuperar sólo los documentos visibles
Document.find(:all)

# recuperar sólo los documentos visibles cuyo título empiece por 'presupuesto'
Document.find(:all, :conditions => "title like 'presupuesto%'")

# recuperar todos los documentos
Document.find(:all, :show_hidden => true)

# ocultar un documento
Document.destroy(id)

# si se tratase de recuperar el documento ocultado
# previamente, saltaría una excepción
Document.find(id)

# volver a hacer visible un documento
Document.show(id)

# borrar el documento de la base de datos
Document.confirm_destroy(id)

Por si a alguien le interesa, puede bajarse el plugin de http://svn.dagi3d.net/rails/acts_as_invisible/tags/acts_as_invisible/ y si tengo algo de tiempo ya le añadiré alguna funcionalidad más como que el nombre del campo utilizado sea configurable.

marze
18/06/2007 11:25

hey! me alegra mucho ver que la comunidad hispana poco a poco va compartiendo código, bien bien bien
puedes ponerlo tb en http://agilewebdevelopment.com/plugins/

Deja un comentario
*: campos obligatorios. La dirección de correo no será publicada