何时在模型中使用自我?

问题:何时需要在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

  1. 它最初要求“在whats_my_active_flag的范围内是否存在active_flag
  2. 它search并实现答案是“不可”,所以它跳上一层,到SomeData的实例
  3. 它再次提出同样的问题:“在这个范围内是否存在active_flag
  4. 答案是“是”,所以它说“我有东西给你”,它返回的!

但是,如果您在whats_my_active_flag定义了active_flag ,然后再次请求它,它将再次执行以下步骤:

  1. 它询问“ whats_my_active_flag的范围内是否存在active_flag
  2. 答案是“是”,所以它返回的值

在任何情况下,除非明确地告诉它,否则不会更改 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)也可以。