Tengo una aplicación donde me gustaría anular el comportamiento de destruir para muchos de mis modelos. El caso de uso es que los usuarios pueden tener una necesidad legítima de eliminar un registro en particular, pero eliminar la fila de la base de datos destruiría la integridad referencial que afecta a otros modelos relacionados. Por ejemplo, un usuario del sistema puede querer eliminar a un cliente con el que ya no hace negocios, pero las transacciones con ese cliente deben mantenerse.¿Cuál es la mejor manera de anular el comportamiento de destrucción de ActiveRecord de Rails?
Parece que tengo al menos dos opciones:
- Los datos duplicados en los modelos necesariamente desnormalización efectivamente mi modelo de datos para que los registros eliminados no afectarán a los datos relacionados.
- Anule el comportamiento de "destrucción" de ActiveRecord para hacer algo así como establecer un indicador que indique que el usuario "eliminó" el registro y use este indicador para ocultar el registro.
¿Echa falta una mejor manera?
La opción 1 me parece una idea horrible, aunque me encantaría escuchar argumentos en contra.
La opción 2 parece algo Rails-ish, pero me pregunto cuál es la mejor manera de manejarlo. ¿Debo crear mi propia clase padre que herede de ActiveRecord :: Base, anular el método de destrucción allí, y luego heredar de esa clase en los modelos donde deseo este comportamiento? ¿Debo también anular el comportamiento del buscador para que los registros marcados como eliminados no se devuelvan de forma predeterminada?
Si hiciera esto, ¿cómo manejaría los buscadores dinámicos? ¿Qué pasa con los ámbitos con nombre?
Gracias Matchu. Estás en lo correcto, necesito usar los datos otra vez, entonces anular no es lo que estoy buscando. Si bien la simplicidad del complemento de Ryan mencionado en su respuesta es atractiva, tu argumento para ser explícito sobre el comportamiento me convenció. Aprecio la respuesta. –