2011-07-27 47 views
0

我有一個非常痛苦的問題,如果有人可以幫忙?無法複製Ruby對象的屬性

我有一個類任務與屬性,我想作一個爆炸方法(因爲我改變了接收器),但我不能夠改變對象的屬性正確:

def reject! 
    return nil if self.previous_owner.nil? 
    self.delegate = false 

    # Before, owner equal a User object 
    self.owner = self.previous_owner # previous_owner is also a User object, but different 
    self.previous_owner = nil 

    return self if self.save 
    raise "Can't save object" 
end 

此次榮獲」因爲self.owner將是零... 我知道這是因爲告訴Ruby self.owner = self.previous_owner,然後改變self.previous_owner爲零。

那麼我該如何避免這種情況呢?我試圖克隆和DUP的方法,但我不知道我想有一個新的複製用戶對象...

奇怪的事情太多,如果我嘗試這個在軌控制檯:

a = 'Foo' 
b = a 
a = 'New value' 

puts a # "New value" 
puts b # "Foo" 

所以我認爲我錯過了一些東西...

+0

對於所有者的訪問器方法是什麼樣的 - 在那裏發生了什麼非標準?或者用戶對象中的@ ='方法?試試'@所有者'而不是'self.owner'?試試'self.owner,self.previous_owner = self.previous_owner,nil'? – Andy

回答

2

請注意,self.ownerself.previous_owner是由Rails提供的便捷方法。實際字段應該被稱爲owner_idprevious_owner_id,幷包含您要鏈接到的User的實際ID。

那麼簡單的,和故障安全的方法是編寫

self.owner_id = self.previous_owner_id 
self.previous_owner = nil # this will unlink the previous owner 
self.save! 

self.save!如果保存失敗將提高。

+0

Thx它的工作原理!但是,您是否知道在調用拒絕後如何停止執行myObject.reload?或者這是正常的嗎? –

+0

備註:在ruby中我們不是駱駝大小寫變量。它被認爲是醜陋的:)如果你需要在拒絕之後訪問'owner',並且之前訪問過'owner',那麼你需要確實重新加載''。 – nathanvda