callback, detalles del encabezado v/s where del detalle directamente usando id del encabezado

7 views
Skip to first unread message

Angel Mauricio Pino Gonzalez

unread,
Nov 17, 2015, 6:34:49 PM11/17/15
to rub...@googlegroups.com
Ojala alguien pueda explicarme lo siguiente.
Ambiente
Linux
Ruby ruby 2.2.2p95 (2015-04-13 revision 50295) [x86_64-linux]
Rails Rails 4.2.4
ActiveAdmin
Formtastic

en el modelo compra_orden

has_many :compra_orden_detalles, dependent: :destroy, inverse_of :compra_orden
accepts_nested_attributes_for :compra_orden_detalles, :allow_destroy => true



en el modelo compra_orden_detalles

belongs_to :compra_orden, :inverse_of :compra_orden_detalles

after_create  :actualiza_co
after_save    :actualiza_co
after_destroy :actualiza_co

private

def actualiza_co
    co = self.compra_orden
    Rails.logger.info "a" * 50
    Rails.logger.info "self.id: #{self.id}  compra_orden.id: #{coid} detalles: #{co.detalles} pendientes: #{co.pendientes}"
    Rails.logger.info "a" * 50
    co.detalles = co.compra_orden_detalles.count('*')
    co.pendientes = co.compra_orden_detalles.sum('cantidad - recibido')
    co.save
    Rails.logger.info "z" * 50
    Rails.logger.info "self.id: #{self.id}  compra_orden.id: #{co.id} detalles: #{co.detalles} pendientes: #{co.pendientes}"
    Rails.logger.info "z" * 50
end

En el test me dice que detalles no se actualiza y en log me muestra esto:

aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
self.id: 980191022  compra_orden.id: 1254326 detalles: 0 pendientes: 0.0
aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
  [1m [36m (0.4ms) [0m   [1mSELECT COUNT(*) FROM `compra_orden_detalles` WHERE `compra_orden_detalles`.`empresa_id` = 663133202 AND `compra_orden_detalles`.`compra_orden_id` = NULL [0m
  [1m [35m (0.4ms) [0m  SELECT SUM(cantidad - recibido) FROM `compra_orden_detalles` WHERE `compra_orden_detalles`.`empresa_id` = 663133202 AND `compra_orden_detalles`.`compra_orden_id` = NULL
  [1m [36mCompraOrden Exists (0.5ms) [0m   [1mSELECT  1 AS one FROM `compra_ordenes` WHERE (`compra_ordenes`.`folio` = BINARY 111 AND `compra_ordenes`.`id` != 1254326) LIMIT 1 [0m
zzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzz
self.id: 980191022  compra_orden.id: 1254326 detalles: 0 pendientes: 0.0
zzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzz

Si se fijan compra_orden_id = NULL

Si cambio 

def actualiza_co()
    co = self.compra_orden
    Rails.logger.info "a" * 50
    Rails.logger.info "self.id: #{self.id}  compra_orden.id: #{co.id} detalles: #{co.detalles} pendientes: #{co.pendientes}"
    Rails.logger.info "a" * 50
    co.detalles = CompraOrdenDetalle.where(['compra_orden_id = ?', co.id]).count('*')
    co.pendientes = CompraOrdenDetalle.where(['compra_orden_id = ?', co.id]).sum('cantidad - recibido')
    co.save
    Rails.logger.info "z" * 50
    Rails.logger.info "self.id: #{self.id}  compra_orden.id: #{co.id} detalles: #{co.detalles} pendientes: #{co.pendientes}"
    Rails.logger.info "z" * 50
  end

EL log queda así y funciona como se espera

aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
self.id: 980191026  compra_orden.id: 1254329 detalles: 2 pendientes: 30.0
aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
  [1m [36m (0.5ms) [0m   [1mSELECT COUNT(*) FROM `compra_orden_detalles` WHERE `compra_orden_detalles`.`empresa_id` = 663133202 AND (compra_orden_id = 1254329) [0m
  [1m [35m (0.4ms) [0m  SELECT SUM(cantidad - recibido) FROM `compra_orden_detalles` WHERE `compra_orden_detalles`.`empresa_id` = 663133202 AND (compra_orden_id = 1254329)
  [1m [36mCompraOrden Exists (0.5ms) [0m   [1mSELECT  1 AS one FROM `compra_ordenes` WHERE (`compra_ordenes`.`folio` = BINARY 111 AND `compra_ordenes`.`id` != 1254329) LIMIT 1 [0m
zzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzz
self.id: 980191026  compra_orden.id: 1254329 detalles: 2 pendientes: 30.0
zzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzz

Lo único que cambie fue actualiza_co

Alguien sabe la razón de la diferencia, por que no funciona como se espera en la primera versión?.

Gracias.
--
Angel Mauricio Pino G
AngelMauricio...@gmail.com
movil 96-436 63 48

Pablo Moreira Mora

unread,
Nov 17, 2015, 6:50:39 PM11/17/15
to rub...@googlegroups.com
Hola Angel, la verdad que no termino de enterder, pero si veo un par de cosas para mejorar.

1. Con hace after_save :actualiza_co es suficiente ya que rails lo llama tanto en la creación como en la actualización.

2. Lo segundo sería usar counter_cache compra_orden.detalles solo guardas la cantidad de compra_orden_detalles que tienen cada compra_orden

Enviado desde mi iPhone
--
Has recibido este mensaje porque estás suscrito al grupo "rubysur" de Grupos de Google.
Para anular la suscripción a este grupo y dejar de recibir sus mensajes, envía un correo electrónico a rubysur+u...@googlegroups.com.
Para acceder a más opciones, visita https://groups.google.com/d/optout.

Angel Mauricio Pino Gonzalez

unread,
Nov 17, 2015, 7:00:38 PM11/17/15
to rub...@googlegroups.com
gracias por "1" pensé que podría ser así, pero no lo probé

lo que me llama la atención es cual es la diferencia entre :.

 co.detalles = co.compra_orden_detalles.count('*')
 co.pendientes = co.compra_orden_detalles.sum('cantidad - recibido')

y

co.detalles = CompraOrdenDetalle.where(['compra_orden_id = ?', co.id]).count('*')
co.pendientes = CompraOrdenDetalle.where(['compra_orden_id = ?', co.id]).sum('cantidad - recibido')

por que lo primero no funciona y la segunda opción si?

Pablo Moreira Mora

unread,
Nov 17, 2015, 9:59:31 PM11/17/15
to rub...@googlegroups.com
Mira lo que se me ocurre qué puede estar pasando es que en el caso 1 este usando lo que está en memoria y no esté actualizado mientras en el 2 estás haciendo una query nueva. Podrías probar haciendo un reload en el caso 1 a ver si cambia.

Enviado desde mi iPhone

Hernan Fernandez

unread,
Nov 18, 2015, 6:13:33 AM11/18/15
to rub...@googlegroups.com

Hola
Fíjate que en los queries de count aparece empresa_id y no se va en la definición de la relación, debes tener un scope o algo que esta aplicando un filtro y para el primer caso no esta cargando orden_id, proba hacer el query desde la consola.

Hernan

Reply all
Reply to author
Forward
0 new messages