dup produces a shallow copy [1]. So in your case, when you call dup, it
creates a copy of the hash, but not the objects that the hash points to. In
order to get the behavior you want, you would need to do a deep copy. One
way to do that would be:

    dup_row = Marshal.load(Marshal.dump(row))

This is idiomatic ruby behavior and shouldn't be affected by rails, though I
can't say for certain it isn't.

[1]: http://www.ruby-doc.org/core/classes/Object.html#M001015

Allen Madsen
http://www.allenmadsen.com


On Mon, Jun 13, 2011 at 12:20 AM, gerberdata <gerb...@gmail.com> wrote:

> Hi not sure if this is where I should post this problem but since
> upgrading to rails 3.07 dup is not working as expected
>
> basically in method I have this
>        dup_row = row.dup
>        #then I delete a row of my original hash
>        row[:athlete].delete(:sports) if !row[:athlete][:sports].nil?
>
>
>   pretty simple but what is happening is it is deleting from the dup
> and the original here is the debug
> code of the original and dup just after deleting the sports
>
>
> original hash values
>
> {"athlete"=>{"first_name"=>"DaveG5600", "gender"=>"M",
> "hometown_id"=>"40", "birthplace_id"=>"30", "last_name"=>"test"},
> "leagues"=>{"league"=>{"id"=>"821", "start_year"=>"1983",
> "end_year"=>"2003"}}, "clubs"=>{"club"=>[{"id"=>"11802",
> "start_year"=>nil, "end_year"=>nil}, {"id"=>"1403", "start_year"=>nil,
> "end_year"=>nil}]}, "schools"=>{"school"=>{"id"=>nil,
> "start_year"=>nil, "end_year"=>nil}},
> "sports"=>{"sport"=>{"id"=>"102", "start_year"=>"1985",
> "end_year"=>"1986", "sport_roles"=>"10"}}}}
>
> dup row (notice sports is missing which even though I am not deleting
> from this hash)
> {"athlete"=>{"first_name"=>"DaveG5600", "gender"=>"M",
> "hometown_id"=>"40", "birthplace_id"=>"30", "last_name"=>"test"},
> "leagues"=>{"league"=>{"id"=>"821", "start_year"=>"1983",
> "end_year"=>"2003"}}, "clubs"=>{"club"=>[{"id"=>"11802",
> "start_year"=>nil, "end_year"=>nil}, {"id"=>"1403", "start_year"=>nil,
> "end_year"=>nil}]}, "schools"=>{"school"=>{"id"=>nil,
> "start_year"=>nil, "end_year"=>nil}}}}
>
> row (this is where I expect to have the sport value deleted which is
> does)
> {"athlete"=>{"first_name"=>"DaveG5600", "gender"=>"M",
> "hometown_id"=>"40", "birthplace_id"=>"30", "last_name"=>"test"},
> "leagues"=>{"league"=>{"id"=>"821", "start_year"=>"1983",
> "end_year"=>"2003"}}, "clubs"=>{"club"=>[{"id"=>"11802",
> "start_year"=>nil, "end_year"=>nil}, {"id"=>"1403", "start_year"=>nil,
> "end_year"=>nil}]}, "schools"=>{"school"=>{"id"=>nil,
> "start_year"=>nil, "end_year"=>nil}}}}
>
>
> Very strange not sure if rails or ruby issue.
>
> --
> You received this message because you are subscribed to the Google Groups
> "Ruby on Rails: Core" group.
> To post to this group, send email to rubyonrails-core@googlegroups.com.
> To unsubscribe from this group, send email to
> rubyonrails-core+unsubscr...@googlegroups.com.
> For more options, visit this group at
> http://groups.google.com/group/rubyonrails-core?hl=en.
>
>

-- 
You received this message because you are subscribed to the Google Groups "Ruby 
on Rails: Core" group.
To post to this group, send email to rubyonrails-core@googlegroups.com.
To unsubscribe from this group, send email to 
rubyonrails-core+unsubscr...@googlegroups.com.
For more options, visit this group at 
http://groups.google.com/group/rubyonrails-core?hl=en.

Reply via email to