Ответ 1
Легко!
@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
Я хотел получить объект на производстве и сделать точную копию (скопировать ее содержимое) на другой объект того же типа. Я попытался сделать это тремя способами с консоли ruby, из которой никто из них не работал:
Скажем, у вас есть tt
как первый объект, который вы хотите скопировать, и tt2
в качестве объекта реплики. Первый подход, который я пробовал, - клонирование массива
tt2.patients = tt.urls.patients
tt2.doctors = tt.segments.doctors
tt2.hospitals = tt.pixels.hospitals
Второй подход, который я пробовал, - это дублирование массива, который фактически совпадает с клонированием массива:
tt2.patients = tt.patients.dup
tt2.doctors = tt.doctors.dup
tt2.hospitals = tt.hospitals.dup
Третий подход, который я пробовал, - marhsalling.
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
) аннулируется (пациенты, врачи и больницы исчезли). Есть ли у вас какие-либо другие идеи по копированию содержимого одного объекта в другой? Спасибо.
Легко!
@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
Это то, что метод ActiveRecord:: Base # clone предназначен для:
@bar = @foo.clone
@bar.save
Ruby Facets - это набор полезных расширений для Ruby и deep_clone, который может сработать для вас.