gpt4 book ai didi

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

转载 作者:数据小太阳 更新时间:2023-10-29 08:39:45 26 4
gpt4 key购买 nike

当我在 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 控制台”时。

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'的description属性也更新了,这不奇怪吗?
我在 http://apidock.com/ruby/Object/clone 中发现了以下警告文档

ruby-1.9.3 中 ActiveRecord 对象克隆的变化

我注意到在 ruby​​-1.9.3 中克隆一个事件记录对象,然后更改原始对象的属性实际上也会更改克隆的对象。在 ruby​​-1.9.2 中不是这种情况。

这个问题是否已经有可用的解决方案?

提前感谢您的任何反馈。

约斯特

最佳答案

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

关于ruby - ruby-1.9.2.p290 或 ruby​​-1.9.3 中 ActiveRecord 对象的克隆更改,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/12103532/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com