Ruby on rails 如何克隆Rails模型属性?

Ruby on rails 如何克隆Rails模型属性?,ruby-on-rails,ruby,ruby-on-rails-4,clone,Ruby On Rails,Ruby,Ruby On Rails 4,Clone,如何在Rails模型中克隆单个属性?这不起作用: irb(main):309:0> u.reload => #<User id: 1, username: "starrychloe", ... irb(main):310:0> u2 = u.dup => #<User id: nil, username: "starrychloe", ... irb(main):311:0> u2 = u.clone => #<User id: 1, use

如何在Rails模型中克隆单个属性?这不起作用:

irb(main):309:0> u.reload
=> #<User id: 1, username: "starrychloe", ...
irb(main):310:0> u2 = u.dup
=> #<User id: nil, username: "starrychloe", ...
irb(main):311:0> u2 = u.clone
=> #<User id: 1, username: "starrychloe", ...
irb(main):312:0> u2.username = u.username.clone
=> "starrychloe"
irb(main):313:0> u2.username = 'star'
=> "star"
irb(main):314:0> u.username ############ Changes original
=> "star"
irb(main):309:0>u.reload
=>#u2=u.dup
=>#u2=u.clone
=>#u2.username=u.username.clone
=>“星光大道”
irb(main):313:0>u2.username='star'
=>“星星”
irb(主要):314:0>u.username(用户名)更改为原始
=>“星星”
这也没有:

irb(main):320:0> u.reload
=> #<User id: 1, username: "starrychloe", ...
irb(main):321:0> u2 = u.clone
=> #<User id: 1, username: "starrychloe", ...
irb(main):322:0> u2[:username] = u[:username].clone
=> "starrychloe"
irb(main):323:0> u2.username = 'cow'
=> "cow"
irb(main):324:0> u.username ############ Changes original
=> "cow"
irb(main):320:0>u.reload
=>#u2=u.clone
=>u2[:用户名]=u[:用户名].clone
=>“星光大道”
irb(main):323:0>u2.username='cow'
=>“奶牛”
irb(主要):324:0>u.username(用户名)更改为原始
=>“奶牛”

#dup
不会复制ID,属性上的
#clone
会保留对同一字符串的引用。无法解决我的问题。

是否要复制实例或属性


要复制实例,请使用
u2=u.dup
not
u2=u.clone

是否复制实例或属性

u2 = User.new(u.attributes.merge(username: "cow"))
要复制实例,请使用
u2=u.dup
not
u2=u.clone

u2 = User.new(u.attributes.merge(username: "cow"))
另外,看看这个问题。它有很多关于类似主题的有趣信息:

另外,看看这个问题。它有很多关于类似主题的有趣信息:

要复制实例及其属性并取消引用,可以执行以下操作:

u2 = u.class.new(u.attributes)

要创建实例及其属性的副本并取消引用,可以执行以下操作:

u2 = u.class.new(u.attributes)

你可能想看看阿米巴宝石

你可能想看看阿米巴宝石

我最终复制了我想要跟踪的每个字段:

@oldUsername = @user.username.clone
User.new
看起来很有希望,但当副本是现有模型时,它将其视为新对象,并输出无效表单以在视图中编辑模型:

> app.controller.view_context.form_for u2 do end   # This is from Rails console
=> "<form accept-charset=\"UTF-8\" action=\"/users\" class=\"new_user\" id=\"new_user_1\" method=\"post\">
>app.controller.view_context.form_for u2 do end#这是来自Rails控制台的
=> "
因此,当它应该修补到/users/1/时,它会尝试修补到/users(从视图),这是无效的


令人难以置信的是Rails无法正确克隆对象。在Java中,您可以使用
u2.setProperty(u.getProperty().clone())
,并确保有一个新对象不会干扰旧对象。

我最终复制了我想要跟踪的每个字段:

@oldUsername = @user.username.clone
User.new
看起来很有希望,但当副本是现有模型时,它将其视为新对象,并输出无效表单以在视图中编辑模型:

> app.controller.view_context.form_for u2 do end   # This is from Rails console
=> "<form accept-charset=\"UTF-8\" action=\"/users\" class=\"new_user\" id=\"new_user_1\" method=\"post\">
>app.controller.view_context.form_for u2 do end#这是来自Rails控制台的
=> "
因此,当它应该修补到/users/1/时,它会尝试修补到/users(从视图),这是无效的


令人难以置信的是,Rails无法正确克隆对象。在Java中,您可以使用
u2.setProperty(u.getProperty().clone())
,并确保有一个不会干扰旧对象的新对象。

对不起,我可能误解了。你也在试图保留id吗?是的,我必须保留id,以便保存后不会在数据库中插入新记录。对不起,我可能误解了。您是否也要保留id?是的,我必须保留id,以便保存后不会在数据库中插入新记录。使用
dup
有效,不应更改原始实例属性。我已经在Rails 4和Ruby 2上对此进行了测试
dup
不会复制id,因为它会初始化实例的新副本,因此不会是数据库中的同一对象。使用
dup
有效,并且不应更改原始实例属性。我已经在Rails 4和Ruby 2上对此进行了测试
dup
不会复制id,因为它会初始化实例的新副本,因此不会是db.Special中的同一个对象,但它认为它是一个新对象。有办法吗<代码>app.controller.view\u context.form\u u2是否结束:
。?我不在视野之内。这是来自Rails控制台的。要编辑。我不想在编辑表单之外显示修改后的值,以防出现验证错误,例如在标题或导航面板中。奇怪,但它认为这是一个新对象。有办法吗<代码>app.controller.view\u context.form\u u2是否结束:
。?我不在视野之内。这是来自Rails控制台的。要编辑。如果出现验证错误,我不希望在编辑表单之外显示修改后的值,例如在标题或导航面板中。