我有一个非常痛苦的问题,如果有人可以提供帮助吗?
我有一个带有属性的类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"
所以我觉得我错过了什么......
答案 0 :(得分:2)
请注意,self.owner
和self.previous_owner
是Rails提供的便捷方法。应该将实际字段称为owner_id
和previous_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!
将会提升。