问:什么时候我需要在Rails的模型中使用self?
我的一个模型中有一个set
方法。
class SomeData < ActiveRecord::Base
def set_active_flag(val)
self.active_flag = val
self.save!
end
end
当我这样做的时候,一切都很好。然而,当我这样做的时候:
class SomeData < ActiveRecord::Base
def set_active_flag(val)
active_flag = val
save!
end
end
active_flag的值不会改变,而是静默地失败。有人能解释一下吗?
我找不到任何副本,但如果有人找到一个也没问题。
发布于 2012-05-30 03:09:26
当您在调用该方法的实例上执行操作时,可以使用self。
使用下面的代码
class SocialData < ActiveRecord::Base
def set_active_flag(val)
active_flag = val
save!
end
end
您正在定义一个名为active_flag的全新作用域局部变量,将其设置为传入的值,它与任何东西都没有关联,因此当方法结束时,它会立即被丢弃,就像它从未存在过一样。
self.active_flag = val
但是会告诉实例修改它自己的名为active_flag的属性,而不是一个全新的变量。这就是它工作的原因。
发布于 2012-05-30 03:10:14
这是为了确保你使用的是setter方法,而不是一个新变量的作用域。这是Ruby和AR的用法细节,经常会让人犯错(另一个是(误用)实例变量)。
注意,已经有了update_attributes!,尽管我理解抽象的愿望。
还有toggle!,它可能更好,这取决于您对标志的接口。
发布于 2017-10-30 23:30:52
当使用active_flag = val
ruby时,如果你认为你是在定义一个局部变量,最好的方法是self.active_flag = val
,如果你得到了它,希望你知道send(:active_flag=, val)
也会工作。
https://stackoverflow.com/questions/10805136
复制相似问题