2011-12-22 22 views
11

私は本番でオブジェクトを取得し、同じタイプの別のオブジェクトに正確なレプリカ(その内容をコピー)を実行したかったのです。Rubyの配列のディープコピー

  1. は、あなたが、あなたはレプリカオブジェクトとしてオーバーとtt2コピーする最初のオブジェクトとしてttがあるとしましょう:私はそれらのどれも働いたルビーコンソールから、3つの方法でこれをやってみました。私が試した最初のアプローチは、クローニングIが試みアレイ

    tt2.patients = tt.urls.patients 
    tt2.doctors = tt.segments.doctors 
    tt2.hospitals = tt.pixels.hospitals 
    
  2. 第2のアプローチは、実際に配列をクローニング同じである配列を複製されている:私は試み

    tt2.patients = tt.patients.dup 
    tt2.doctors = tt.doctors.dup 
    tt2.hospitals = tt.hospitals.dup 
    
  3. 第三のアプローチは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)のすべてのコンテンツは無効になります(患者、医師、病院はなくなります)。あるオブジェクトの内容を別のオブジェクトにコピーすることについて他のアイデアはありますか?ありがとう。

@bar = @ bar.save

+1

最初の例で変数を設定するだけです。代わりにtt2.patients = tt.patiens.cloneを試してください。 – three

答えて

5

これはActiveRecord::Base#clone方法が何のためにあるのかです!

@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 
15

簡単@

foo.clone:

+0

これは素晴らしい動作します。 new_ttには今必要なすべての情報があります。しかし、あなたが上で言ったことをした後、tt2(患者、医者、病院)の内容はすべて消えてしまいます。あなたはどのようにtt2の内容を保持していますか? –

+0

Woops!私は文法上の間違いがあった。上記のコードを更新しました。やってみて。 – Trip

+0

これと彼の2番目のアプローチの違いは何ですか? –

2

Ruby Facetsは、Rubyの便利な拡張機能のセットで、あなたのために働くかもしれないdeep_clone方法があります。