2008-10-14 20 views
15

creo que es importante tener un "deshacer" método ala Gmail al destruir los registros en lugar de mostrar una ventana emergente molesto que dice: "¿Seguro?".¿Cuál es la mejor manera de implementar el estilo de Gmail "deshacer" en Rails?

La forma en que he implementado esto es tener una columna de marca de tiempo "deleted_at" en el modelo que consigue marcado con la fecha cuando destruir método se llama

def destroy 
    @foo = Foo.find(params[:id]) 
    @foo.update_attribute(:deleted_at, Time.now) 
    ... 
end 

Para Revert/deshacer voy acaba de establecer la misma columna a cero

def revert 
    @foo = Foo.find(params[:id]) 
    @foo.update_attribute(:deleted_at, nil) 
    ... 
end 

voy a tener que añadir una condición para filtrar fuera "borrado" Foos cuando llamo el método de búsqueda. Tal vez establezca una tarea cron o de fondo para destruir realmente los foos "eliminados" después de un tiempo.

Funciona para mí y es fácil de implementar, pero tengo curiosidad acerca de si existe una mejor manera de implementar esta función. Tal vez hay un complemento o una gema que proporciona esto que no conozco.

+0

¿De verdad te importa cuando se eliminó? ¿No es suficiente una bandera? –

+4

Sí, realmente no me importa cuando se eliminó por el momento, pero ese conocimiento podría ser útil en el futuro. De todos modos, creo que las marcas de tiempo son una buena bandera. – JasonOng

+1

Estoy de acuerdo con el sentimiento general.Sin embargo, un problema posible al adelantarse a necesidades como esa es que podría engañar a otros desarrolladores para que busquen dónde se usa actualmente esa información (marca de tiempo). Cuando en realidad no se usa en algún lugar, representa un hilo suelto, que a menudo es frustrante y consume mucho tiempo para los no iniciados. – Magne

Respuesta

4

De hecho, hay algunos complementos que se pueden encontrar en Agile Web Development.

aquí están los enlaces y los resúmenes de los plugins que parecen coincidir con su descripción:

  1. Acts as Paranoid: hacer que su Active Records "paranoica". Al eliminarlos no se elimina la fila, sino que se establece un campo deleted_at. Buscar está sobrecargado para omitir los registros eliminados.
  2. Acts as soft deletable: Ofrece la capacidad de eliminar software de los modelos de ActiveRecord.
+0

Parece que Hechos como paranoico podría tener algunos problemas con versiones futuras de ActiveRecord ya que anula el método de búsqueda. Acts As Soft Deletable se ve bien. Me pregunto si la tabla eliminada no está sincronizada, ¿cómo puedo resincronizarla? ¿Alguna vez ha usado alguno de ellos? – JasonOng

+0

No, pero en la descripción del borrado suave dice que tiene métodos de ayuda incorporados para mantenerlos sincronizados – Tilendor

+0

Una breve reseña de los dos hace que parezca que los actos como eliminables suaves serían la mejor opción, tanto para el método utilizado y el hecho de que parece estar mejor mantenido. –

0

Hay un archivo here que parece hacer lo que necesita, pero personalmente creo que debe haber algo por ahí que automáticamente elimine los registros eliminados a menos que los incluya específicamente. De esa forma, en realidad aparecerán eliminados a menos que incluya un parámetro o un alcance nombrado que los vuelva a incluir.

Lamentablemente, no he escrito ninguno y el tiempo libre es limitado, pero no debería ser tan difícil, ¿o sí?

-1

patrón de cadena de responsabilidad

class Action 
{ 
    Perform(context); 
    Undo(context); 
} 
+2

Esto es muy vago y no me da ninguna idea sobre cómo deshacer realmente. ¿Cuál es el contexto? ¿Cómo interactúa con la base de datos? – Tilendor

0

Puede mover los elementos eliminados en una recogida selectiva (o una mesa, o lo que sea) - entonces cualquier cosa que se ve en la lista original verá que ha sido eliminado, y se puede tratar con la nueva lista cuando sea conveniente.

0

PaperTrail hace esto muy bien. Hay un buen Railscast en él, aunque ahora es un poco viejo. Sé que esta pregunta se hizo hace bastante tiempo, pero me encontré con ella por curiosidad y pensé que debería hacer referencia a una buena manera actualizada de hacer esto.

Cuestiones relacionadas