无法复制Ruby对象的属性

时间:2011-07-27 10:00:36

标签: ruby-on-rails ruby ruby-on-rails-3

我有一个非常痛苦的问题,如果有人可以提供帮助吗?

我有一个带有属性的类Task,我想制作一个bang方法(因为我正在更改接收器)但是我无法正确更改对象属性:

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改为nil。

那我怎么能避免这个呢?我尝试了克隆和dup方法,但我不确定我是否想要一个新复制的User对象......

奇怪的是,如果我在rails console中尝试这个:

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

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

所以我觉得我错过了什么......

1 个答案:

答案 0 :(得分: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!将会提升。