lobo_tuerto
2009-Jun-03 17:54 UTC
Deleting records using nested attributes decreases the counter cache twice
Hi guys, I have these models: class Compra < ActiveRecord::Base belongs_to :proveedor has_many :detalle_de_compras has_many :lotes, :through => :detalle_de_compras accepts_nested_attributes_for :detalle_de_compras, :allow_destroy => true def nombre_proveedor self.proveedor.try(:nombre) end end class DetalleDeCompra < ActiveRecord::Base belongs_to :compra, :counter_cache => true belongs_to :lote accepts_nested_attributes_for :lote end The problem is that when I delete a "DetalleDeCompra" through an update to "Compra" using nested attributes (with the _delete param set to something that evaluates to true) the counter cache is decreased twice. I don''t know if it''s worth mentioning that I''m sending data for a 2 level deep nested structure. This is the deepest model I''m using: class Lote < ActiveRecord::Base belongs_to :estado_del_lote belongs_to :producto has_one :detalle_de_compra has_one :compra, :through => :detalle_de_compra def nombre_producto self.producto.try(:nombre) end def nombre_estado_del_lote self.estado_del_lote.try(:nombre) end def fecha_compra self.compra.try(:fecha) end end Any ideas on what''s wrong here? P.S. Here is the migration to the model holding the counter cache: class CreateCompras < ActiveRecord::Migration def self.up create_table :compras do |t| t.integer :proveedor_id t.date :fecha t.date :fecha_de_pago t.string :condicion_de_pago t.integer :detalle_de_compras_count, :default => 0 t.timestamps end end def self.down drop_table :compras end end
Luca Guidi
2009-Jun-03 19:21 UTC
Re: Deleting records using nested attributes decreases the counter cache twice
Hi, please can you specify which version of Rails are you currently using, and an example of the code that causes your problem? I tried to reproduce it with: compra.update_attributes :detalle_de_compras_attributes => [{:id => 953125641, :_delete => true}] but works fine for me, it decrements the counter once. Cheers, Luca -- blog: www.lucaguidi.com
lobo_tuerto
2009-Jun-04 15:39 UTC
Re: Deleting records using nested attributes decreases the counter cache twice
I''m using Rails 2.3.2, on Ubuntu 8.10. Ok, here is a capture of the "params" sent to create a record, with the nested params: # URL: http://localhost:3000/compras/create # Compra params compra[fecha] 2009-06-04 compra[proveedor_id] 1 compra[condicion_de_pago] 15 dias compra[fecha_de_pago] 2009-06-18 # First nested model, DetalleDeCompra params compra[detalle_de_compras_attributes][0][id] compra[detalle_de_compras_attributes][0][cantidad] 10 compra[detalle_de_compras_attributes][0][precio_unitario] 123 # Second nested model, Lote params compra[detalle_de_compras_attributes][0][lote_attributes][cantidad] 10 compra[detalle_de_compras_attributes][0][lote_attributes] [estado_del_lote_id] 2 compra[detalle_de_compras_attributes][0][lote_attributes][producto_id] 5 Then the params to delete that DetalleDeCompra instance that triggers the problem: # URL: http://localhost:3000/compras/update/3 compra[fecha] 2009-06-04 compra[proveedor_id] 1 compra[condicion_de_pago] 15 dias compra[fecha_de_pago] 2009-06-18 compra[detalle_de_compras_attributes][0][id] 8 compra[detalle_de_compras_attributes][0][cantidad] 10 compra[detalle_de_compras_attributes][0][precio_unitario] 123 compra[detalle_de_compras_attributes][0][_delete] true compra[detalle_de_compras_attributes][0][lote_attributes][cantidad] 10 compra[detalle_de_compras_attributes][0][lote_attributes] [estado_del_lote_id] 2 compra[detalle_de_compras_attributes][0][lote_attributes][producto_id] 5 And the code, is the same code that all controllers have in the Update action: @data = Compra.find(params[:id]) @data.update_attributes(params[compra]) @data.save Best regards.
lobo_tuerto
2009-Jun-04 15:42 UTC
Re: Deleting records using nested attributes decreases the counter cache twice
Ah!, forgot to mention that the count then goes from 1 record to -1 records.
Luca Guidi
2009-Jun-05 15:29 UTC
Re: Deleting records using nested attributes decreases the counter cache twice
Hi, just gave a look at your code, the problem is trivial: you shouldn''t call both #update_attributes *and* #save, because they performs the same operation. The former is a syntax shortcut: person.name = "luca" person.age = 26 person.save # or person.update_attributes :name => "luca", :age => 26 So, updating *twice* your record, the detalle de compras counter will be decreased assuming the value of -1. Cheers, Luca -- blog: www.lucaguidi.com
lobo_tuerto
2009-Jun-06 21:46 UTC
Re: Deleting records using nested attributes decreases the counter cache twice
Ah! thank you a lot :) Works flawless now. Best regards. On 5 jun, 10:29, Luca Guidi <guidi.l...@gmail.com> wrote:> Hi, just gave a look at your code, the problem is trivial: you shouldn''t > call both #update_attributes *and* #save, because they performs the same > operation. The former is a syntax shortcut: > > person.name = "luca" > person.age = 26 > person.save > > # or > > person.update_attributes :name => "luca", :age => 26 > > So, updating *twice* your record, the detalle de compras counter will be > decreased assuming the value of -1. > > Cheers, > Luca > -- > blog:www.lucaguidi.com