Pregunta

Creo que es importante tener un " deshacer " método ala gmail al destruir registros en lugar de mostrar una ventana emergente molesta que dice: " ¿Estás seguro? " ;.

La forma en que lo he implementado es tener un " deleted_at " columna de marca de tiempo en el modelo que se marca cuando se llama al método destroy

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

Para revertir / deshacer simplemente estableceré la misma columna en nula

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

Solo tendré que agregar una condición para eliminar " eliminado " Foos cuando llamo al método encontrar. Tal vez configure una tarea cron o de fondo para destruir realmente " eliminado " Después de algún tiempo.

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

¿Fue útil?

Solución

De hecho, hay algunos complementos que se pueden encontrar en Desarrollo web ágil .

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

  1. Actúa como paranoico : haga sus Registros activos " paranoid. " Al eliminarlos no se elimina la fila, sino que se establece un campo deleted_at. La búsqueda está sobrecargada para omitir registros eliminados.
  2. Actúa como borrado suave : ofrece la posibilidad de eliminar de manera suave los modelos ActiveRecord.

Otros consejos

Hay un archivo aquí que parece hacer lo que necesita, pero personalmente creo que debe haber algo que filtre automáticamente los registros eliminados a menos que los incluya específicamente. De esa forma, realmente aparecerían eliminados a menos que incluyas un parámetro o un ámbito con nombre que los vuelva a incluir.

Desafortunadamente, no he escrito uno y el tiempo libre es limitado, pero no debería ser tan difícil, ¿verdad?

Puede mover los elementos eliminados a una colección separada (o tabla, o lo que sea); luego, cualquier elemento que se vea en la lista original verá que se eliminó, y puede manejar la nueva lista cuando sea conveniente.

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

patrón de cadena de responsabilidad

class Action
{
  Perform(context);
  Undo(context);
}
Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top