Hi all. Maybe somebody can explain that to me:
def create @orders = Order.find(:all, :conditions => ["products.member_id = ?", current_login.member.id]) # new payment @payment = Payment.new @payment.member = current_login.member @payment.status = Payment::STATUS_NEW @payment.save
sum = 0.00 @orders.each do |order| order.payment = @payment order.save sum += 2950 end logger.info "COUNT A: #{@payment.orders_count}" @payment.update_attribute(:total, sum) @payment.reload logger.info "COUNT B: #{@payment.orders_count}"
works fine but for one point: The counter cache is 0 after that.
Reason is this.
While the line
order.payment = @payment
generates the necessary code to update the counter_cache (twice):
UPDATE payments SET `orders_count` = `orders_count` + 1 WHERE (`id` = 1017343603)
the update_attribute line updates more than necessary:
UPDATE `payments` SET `created_at` = '2008-06-03 18:42:03', `member_id` = 762526581, `status` = 1, `orders_count` = 0, `total` = 5900.0, `updated_at` = '2008-06-03 18:42:03' WHERE `id` = 1017343603
Why is it updating not only the total and updated_at, but in addition a whole set of different columns, that where not even changed since the @payment.save?
Am I doing something terribly wrong? I could handle this for the specific problem, but I see a lot of possible side effects here and would at least want to understand, what's the reason for Rails to behave that way...