If you want deep copy you should use Marshal:

class Hash
  def deep_dup
    Marshal::load(Marshal::dump(self))
  end
end

foo = {:b=>{:c=>{:d=>1}}}
bar = foo.deep_dup

foo[:b][:c][:d] = 2
p foo # => {:b=>{:c=>{:d=>2}}}
p bar # => {:b=>{:c=>{:d=>1}}}

On 13 июн, 07:21, gerbdla <[email protected]> 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 for Hash
>
> 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}}}}

-- 
You received this message because you are subscribed to the Google Groups "Ruby 
on Rails: Talk" group.
To post to this group, send email to [email protected].
To unsubscribe from this group, send email to 
[email protected].
For more options, visit this group at 
http://groups.google.com/group/rubyonrails-talk?hl=en.

Reply via email to