find_or_initialize_by_id block parameter

On the other forum on stackoverflow, someone provided this as a solution for the following use case: "I want to check by an unique ID whether a record is already created. If it is, I want to add 1 to the amount attribute. If it is not, I want to create it and set the amount attribute to 1."

Here was their solution:

@have = current_user.haves.find_or_initialize_by_id(params[:have]) do | h>   h.amount = 0 end

I don't think it's a great one, but I have a question about the block. Let's say the record already exists and so the find is triggered and when the record is queried, it has an amount value of 3. When that block is executed, it looks like the amount value would be assigned a value of 0. Or am I missing something?

The 'do' block only executes if the find_or_initialize_by method creates the record.

The find_or_initialize_by method does not execute the 'do' block if the record exists.

Feature of Ruby that the 'do' block goes to the method and the method must yield to execute the block.

Douglas Lovell www.wbreeze.com