2011-07-27 4 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 = nilに変更すると、私は知っています。 これはRubyにself.owner = self.previous_ownerを伝えてから、self.previous_ownerをnilに変更することによって起こります。

どうすればこの問題を回避できますか?私はレールコンソールでこれをしようとすると、あまりにも...

奇妙なことに、私はクローンとDUP方法を試してみましたが、私は新しいコピーされたユーザーオブジェクトを持つようにしたいかわからない:

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

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

だから私は、私は何かが欠けていると思います...

+0

所有者のアクセサーメソッドはどのように見えますか?非標準的なことは何ですか?あるいは、ユーザオブジェクトの '@ ='メソッドですか? 'self.owner'ではなく' @ owner'を試してみてください。 'self.owner、self.previous_owner = self.previous_owner、nil'を試してみてください。 – Andy

答えて

2

self.ownerself.previous_ownerは、Railsが提供する便利な方法です。実際のフィールドはowner_idprevious_owner_idのようになり、リンク先の実際のIDはUserです。

はそう単純であり、フェイルセーフなアプローチは、保存が失敗した場合に発生します

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

備考:ルビーでは、キャメルケースの変数はありません。醜いと見なされます:)あなたが 'reject'の後に' owner'にアクセスする必要があり、あなたが 'owner'に前にアクセスした場合は、実際に' reload'を行う必要があります。 – nathanvda