何时在模型中使用自我?
问题:何时需要在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值不会改变,而是静默地失败。 有人可以解释吗?
我找不到任何重复,但如果有人发现一个也没问题。
当你正在调用方法的实例时,你使用self。
用这个代码
 class SocialData < ActiveRecord::Base def set_active_flag(val) active_flag = val save! end end 
您正在定义一个名为active_flag的全新范围局部variables,将其设置为传入值,它与任何内容都没有关联,因此在方法结束时会立即抛出,因为它从不存在。
 self.active_flag = val 
但是告诉实例修改它自己的属性叫做active_flag,而不是一个全新的variables。 这就是为什么它的作品。
这是因为范围的缘故。 当你在一个方法的内部,并尝试设置一个像这样的新variables:
 class SomeData < ActiveRecord::Base def set_active_flag(val) active_flag = val end end 
 您正在创build一个全新的variables,它存在于set_active_flag中。 一旦完成执行,它就会消失,不会以任何方式改变self.active_flag (实际的实例variables)。 
然而 (这是我的困惑之源):当你尝试在ruby中读取一个实例variables时,像这样:
 class SomeData < ActiveRecord::Base def whats_my_active_flag puts active_flag end end 
 你实际上会得到self.active_flag (实际的实例variables)返回。 
原因如下:
  Ruby将尽其所能避免返回nil 。 
-  它最初要求“在
whats_my_active_flag的范围内是否存在active_flag? - 它search并实现答案是“不可”,所以它跳上一层,到SomeData的实例
 -  它再次提出同样的问题:“在这个范围内是否存在
active_flag? - 答案是“是”,所以它说“我有东西给你”,它返回的!
 
 但是,如果您在whats_my_active_flag定义了active_flag ,然后再次请求它,它将再次执行以下步骤: 
-  它询问“ 
whats_my_active_flag的范围内是否存在active_flag? - 答案是“是”,所以它返回的值
 
 在任何情况下,除非明确地告诉它,否则不会更改 self.active_flag的值。 
 描述这种行为的一个简单的方法是“它不想让你失望”,并返回nil – 所以它尽最大努力find它。 
同时,“它不想搞乱你不想改变的数据”,所以它不会改变实例variables本身。
希望这可以帮助!
这是为了确保你使用setter方法,而不是确定一个新的variables。 这是一个Ruby和AR的使用细节,经常让人们往上走(另一个是实例variables的(错误)使用)。
请注意,已经有update_attributes了! 尽pipe我理解抽象的欲望。
还有切换! ,这可能更好,这取决于你的国旗接口。
 当使用active_flag = val ruby时,认为你定义了一个局部variables,最好的办法是self.active_flag = val ,如果你知道的话,希望你知道send(:active_flag=, val)也可以。