2012-03-28 1 views
2

私は、アクティブレコードモデルとその階層の全負荷を複製するために使用されるアプリケーションに機能を書いています。私が偶然に元のレコードを変更しないように、リレーションシップの#readonly機能を使用しています。これは素晴らしいことです。複製されたActiveRecordモデルから読み取り専用ステータスを削除するにはどうすればよいですか?

私はこれらの元のオブジェクトをコピーするのに#cloneメソッドを使用していますが、作成した新しいオブジェクトを保存できないことを意味するクローンオブジェクトの読み取り専用ステータスを削除する方法がないようです。

#readonlyを使用せずに元のオブジェクトを読み込むと正常に動作しますが、誤って元のレコードが削除される危険性があります。

読み取り専用状態を削除するにはどうすればよいですか?

答えて

10

instance_variable_setを使用しますか?

my_obj = Object.where(:stuff, :readonly => true) 
my_obj.x = "y" 
my_obj.save! #readonly exception 
my_obj.send(:instance_variable_set, :@readonly, false) 
my_obj.save! #succeeds 

クリーンな方法があるかどうかわかりません。

1

これを行う理由によっては、代わりにデータベースをコピーするほうが簡単かもしれません(mysqldumpなど)。

、他の一方で、あなたはルビーでそれを行う必要がある場合、あなたはdeep_cloneable宝石を見てみるのが好きかもしれません:

original_record.dup :include => [:associated_records] 
関連する問題