何时在模型中使用自我?
问题:何时需要在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)
也可以。