Глубокая копия массивов в Ruby - PullRequest
13 голосов
/ 22 декабря 2011

Я хотел получить объект на производстве и сделать точную копию (скопировать его содержимое) на другой объект того же типа. Я попытался сделать это тремя способами из консоли ruby, но ни один из них не работал:

  1. Допустим, у вас есть tt в качестве первого объекта, который вы хотите скопировать, и tt2 в качестве объекта реплики. Первый подход, который я попробовал, это клонирование массива

    .
    tt2.patients  = tt.urls.patients
    tt2.doctors   = tt.segments.doctors
    tt2.hospitals = tt.pixels.hospitals
    
  2. Второй подход, который я попробовал, состоит в дублировании массива, который фактически совпадает с клонированием массива:

    tt2.patients  = tt.patients.dup
    tt2.doctors   = tt.doctors.dup
    tt2.hospitals = tt.hospitals.dup
    
  3. Третий подход, который я попробовал, - маршаллинг.

    tt2.patients  = Marshal.load(Marshal.dump(tt.patients)) 
    tt2.doctors   = Marshal.load(Marshal.dump(tt.doctors)) 
    tt2.hospitals = Marshal.load(Marshal.dump(tt.hospitals)) 
    

Ничто из вышеперечисленного не работает для глубокого копирования из одного массива в другой. После опробования каждого подхода, описанного выше, все содержимое первого объекта (tt) обнуляется (пациенты, врачи и больницы исчезли). Есть ли у вас другие идеи по копированию содержимого одного объекта в другой? Спасибо.

Ответы [ 3 ]

18 голосов
/ 22 декабря 2011

Легко!

@new_tt            = tt2.clone
@new_tt.patients   = tt2.patients.dup
@new_tt.doctors    = tt2.doctors.dup
@new_tt.hospitals  = tt2.hospitals.dup
@new_tt.save
5 голосов
/ 22 декабря 2011

Для этого ActiveRecord :: Base # clone предназначен метод:

@ bar = @ foo.clone

@bar.save

2 голосов
/ 22 декабря 2011

Ruby Facets представляет собой набор полезных расширений для Ruby и имеет метод deep_clone , который может работать для вас.

...