run rails migrations generate foreign column belong association ruby-on-rails activerecord gmail undo revert

ruby-on-rails - generate - ruby on rails run migrations



¿Cuál es la mejor manera de implementar el estilo de Gmail "deshacer" en Rails? (5)

Aquí hay un archivo 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, en realidad aparecerán eliminados a menos que incluya un parámetro o un alcance nombrado que los vuelva a incluir.

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

Creo que es importante tener un método " deshacer " 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 una columna de indicación de fecha y hora "deleted_at" en el modelo que recibe el sello de la hora cuando se llama el método de destrucción.

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

Para revertir / deshacer voy a configurar la misma columna a cero

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

Solo tendré que agregar una condición para filtrar foos "eliminados" cuando llamo al método find. 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 sobre si hay una mejor manera de implementar esta función. Tal vez hay un complemento o una gema que proporciona esto que no conozco.


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

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

  1. Actúa como paranoico : convierte tus registros activos en "paranoicos". Al eliminarlos no se elimina la fila, sino que se establece un campo deleted_at. Buscar está sobrecargado para omitir los registros eliminados.
  2. Actúa como eliminable suave : brinda la capacidad de eliminar software de los modelos de ActiveRecord.

Puede mover los elementos eliminados a una colección separada (o tabla, o lo que sea) - luego todo lo que se ve en la lista original verá que se ha eliminado, y puede tratar con la nueva lista cuando sea conveniente.


patrón de cadena de responsabilidad

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


PaperTrail lo hace muy bien. Hay un buen Railscast , 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.