2014-01-27 335 views
2

如何在Rails模型中克隆單個屬性?這不起作用:如何克隆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):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" 

#dup不會複製ID,並#clone的屬性保持參照相同的字符串。 This不會解決我的問題。

+1

使用'dup'工程,不應該改變你原來的實例屬性。我已經在Rails 4和Ruby 2上測試過了。'dup'不會複製id,因爲它初始化實例的一個新副本,因此不會是db中的同一個對象。 –

回答

0

我最終使每一個我想跟蹤字段的副本:

@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\"> 

因此,這將嘗試補丁/用戶(從視圖),這是無效的,當它應該補丁/用戶/ 1 /。

令人難以置信的是,Rails不會正確克隆對象。在Java中,您可以使用u2.setProperty(u.getProperty().clone()),並確保有一個不會干擾舊的對象。

1

是否要複製實例或屬性?

要複製實例,請使用u2 = u.dup而不是u2 = u.clone

+0

對不起 - 我可能誤解了。你也試圖保留身份證嗎? – Swards

+0

是的,我必須保留這個ID,這樣一旦保存,它就不會在數據庫中插入一條新記錄。 – Chloe

0

爲了與它的屬性實例的副本,並取消引用你可以這樣做:

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

奇特的,但它認爲這是一個新的對象。有沒有辦法解決這個問題? 'app.controller.view_context.form_for u2 do end':'

... '。 – Chloe

+0

你在視圖中做這件事的任何原因? – bjhaid

+0

?我不是這樣認爲的。這是來自Rails控制檯。 – Chloe