Fue un problema, pero ya lo soluciones, es por si a alguien le resulta útil.
Ruby 2.2.5
Rails 4.2.6
Active_Admin y muchas otras gemas.
Tema actualizar documentos dependientes en un callback
OJO solo pondré los campos que son importantes para lo que quiero aclarar.
Orden de venta
OV_detalle
Tiene campos: Producto_id, cantidad, entregado, facturado
Guias Despacho
GD Detalle
Tiene campos: OV_detalle_id y cantidad
Facturas
F_detalle
Tiene campos: Guia_Despacho
modelo F_Detalle tiene un callback
afte_create y actualiza campos de OV_Detalle tomando la relación desde GD_detalle, desde Guia_Despacho desde F_detalle.
Funciono hasta que ocurrió que la misma OV_detalle estaba en GD_detalle diferentes, ocurría que la ultima actualización pisaba las demás como si las anteriores no existieran.
Como estaba al principio
gd = self.guia_despacho
gd.guia_despacho_detalles.each do |gdd|
vod = gdd.venta_orden_detalle_id
vod.update_attribute(:facturado, vod.facturado + gdd.cantidad)
end
Despues de arreglarlo
gd = self.guia_despacho
gd.guia_despacho_detalles.each do |gdd|
vod = VentaOrdenDetalle.find( gdd.venta_orden_detalle_id)
vod.update_attribute(:facturado, vod.facturado + gdd.cantidad)
end
Puede que así presentado resulte obvio, pero para mi no lo fue, pensé en los commit, etc. Simplemente era que no traía los datos frescos de la BD, si no que usa los que están en memoria. Por lo que si se actualizaba una "vod" dos veces y partía en cero con digamos 7 y 8, solo guardaba 8. No traía el que guardo con 7 en la primera pasada. Para así terminar con 15.
Espero a alguien le sea útil.
Debo agregar que los solucione gracias a usar TDD y muchos datos de prueba y muchas muchas pruebas. Mirar logs, etc.
Porfa no hablen de modelos y otras cosas que no viene al caso trate de simplificar lo más posible el ejemplo.
--