2

ruby-1.9.2-p290 で単純なオブジェクトを複製すると、すべて問題ないように見えます

class Klass
    attr_accessor :str
end
s1 = Klass.new         #=> #<Klass:0x401b3a38>
s1.str = "Hello"       #=> "Hello"
s2 = s1.clone          #=> #<Klass:0x401b3998 @str="Hello">
s2.str = "Hello world" #=> "Hello world"
s2                     #=> #<Klass:0x00000100977c40 @str="Hello world">
s1                     #=> #<Klass:0x00000100993fa8 @str="Hello">

しかし、ActiveRecord オブジェクトのクローンを作成すると、奇妙なことが起こります。

私はレール3.1.8を使用しています。開発環境 (Rails 3.1.8) をロードしています。「レールコンソール」を起動すると。

ruby-1.9.2-p290 :001 > chair = Chair.new(:code => 'code', :description => 'The Description')
#=> #<Chair id: nil, code: "code", description: "The Description", user_id: nil, created_at: nil, updated_at: nil> 
ruby-1.9.2-p290 :002 > chair_clone = chair.clone
#=> #<Chair id: nil, code: "code", description: "The Description", user_id: nil, created_at: nil, updated_at: nil> 
ruby-1.9.2-p290 :003 > chair_clone.description = "Update description"
#=> "Update description" 
ruby-1.9.2-p290 :004 > chair_clone
#=> #<Chair id: nil, code: "code", description: "Update description", user_id: nil, created_at: nil, updated_at: nil>     
ruby-1.9.2-p290 :005 > chair
#=> #<Chair id: nil, code: "code", description: "Update description", user_id: nil, created_at: nil, updated_at: nil> 

元のオブジェクト「椅子」の説明属性も更新されているのはおかしくないですか?http://apidock.com/ruby/Object/clone doc
で次の警告を見つけました

ruby-1.9.3 での ActiveRecord オブジェクトのクローンの変更

ruby-1.9.3 でアクティブなレコード オブジェクトを複製し、元のオブジェクトの属性を変更すると、実際には複製されたオブジェクトも変更されることに気付きました。これは ruby​​-1.9.2 では当てはまりませんでした。

この問題の解決策は既にありますか?

フィードバックをお寄せいただきありがとうございます。

ヨースト

4

2 に答える 2

4

clone次のように使用する代わりにdup:
...
chair_clone = chair.dup
...

于 2012-09-24T14:48:30.960 に答える
0
u = User.last
u.duplicable? # => true
u2 = u.dup
u2.email = 'wwwww'
u.email # => 'megacoder@rambler.ru'
u2.email # => 'wwwww'
于 2012-08-24T05:58:13.683 に答える