Rails: perdiendo la cabeza con before_save

Recientemente encontré un ‘bug’ en una aplicación que estoy desarrollando, tiene que ver con los callbacks de Rails, en específico before_save.

Por fín lo he resuelto, no de la manera que esperaba, tal vez por berrinchudo ya que aún me queda una duda, pero al fin puedo continuar desarrollando y un peso se ha ido de mí.

La parte afectada de la aplicación involucra 2 modelos, digamos:

class Category
  has_many :products
end
 
class Products
  belongs_to :category
end
 
app/models/category.rb
before_save
  return unless self.published
  self.products.first.amount = (algun calculo dinámico)
end

Justo en este callback es donde está lo misterioso, la cantidad(amount) del primer producto nunca cambiaba amenos que actualizara la categoría, la publicara y la grabara 2 veces!! a la 2a vez el cálculo se realizaba, esto me quitó el sueño y me hizo perder gran cantidad de tiempo analizando el problema.

por qué a la 2a vez si pasaba?

Corrí la aplicación con el debugger y pues Rails sí pasaba por esa parte del código pero la cantidad del producto quedaba intacta, incluso intente cosas como estas:

app/models/category.rb
before_save
  return unless self.published
  self.products.first.amount = (algun calculo dinámico)
  self.name = 'Algún nombre'
end

Y pues la primera vez que grababa, ya con el atributo de published en true, name sí se actualizaba pero amount no! sólo hasta la segunda… hasta la fecha no entiendo por que sucede esto, no he logrado llegar a una conclusión, lo que sí es que por lo pronto ya encontré una solución:

app/models/category.rb
before_save
  return unless self.published
  self.products.first.update_attribute(:amount, (algun calculo dinámico))
end

De esta manera el cálculo ocurre todas y cada una de las veces que la categoría es actualizada.