在ruby-1.9.2.p290或ruby-1.9.3中更改ActiveRecord对象的克隆

时间:2012-08-24 05:22:15

标签: ruby ruby-on-rails-3 activerecord clone

当我在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对象时,会发生一些奇怪的事情:

我正在使用rails 3.1.8。 加载开发环境(Rails 3.1.8)。 当我启动'rails console'时。

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> 

原始对象'chair'的描述属性也被更新,这不奇怪 我在http://apidock.com/ruby/Object/clone doc

中发现了以下警告

在ruby-1.9.3

中更改ActiveRecord对象的克隆

我注意到在ruby-1.9.3中克隆一个活动记录对象然后更改原始对象上的属性实际上也会改变克隆对象。在ruby-1.9.2中并非如此。

是否已有针对此问题的解决方案?

提前感谢您的任何反馈。

Joost的

2 个答案:

答案 0 :(得分:4)

而不是使用clone使用dup,如: ...
chair_clone = chair.dup
...

答案 1 :(得分:0)

u = User.last
u.duplicable? # => true
u2 = u.dup
u2.email = 'wwwww'
u.email # => 'megacoder@rambler.ru'
u2.email # => 'wwwww'