为什么ActiveRecord回调要求实例变量或实例方法以self关键字为前缀?

ActiveRecord有一些不同的回调方法用于简化模型逻辑。 例如after_findbefore_create方法。

考虑以下代码示例:

 class ExternalPrintingCard < ActiveRecord::Base belongs_to :user belongs_to :ph_user after_create :change_pin def change_pin self.user.randomize_printer_pin end def after_find return if self.card_status == false self.card_status = false if self.is_used_up? self.card_status = false if self.is_expired? self.save! end end 

如果我从实例变量或实例方法中删除所有自带前缀,则会调用这两个回调,但就好像它们是这些回调方法中的局部变量一样。

这个实例变量( card_status ),实例方法( save!is_used_up?is_expired? )和关联( user )在这两个没有self前缀的回调方法之外工作正常。

Rails文档中用于回调方法(实例方法)的示例代码似乎总是使用self前缀,即使它正在调用实例变量或方法,正确地说它们可以在没有self前缀的情况下访问。

我希望有更好理解ActiveRecord回调的人可以帮助揭示这种行为。

干杯

从技术上讲,您只需要在分配方法前使用self。 这对于区分具有trailing =的实例方法和对局部变量的赋值是必要的。

纳斯莫恩是对的。

ActiveRecord :: Base将所有列名放在@attributes实例变量(Hash)中,并为这些列名创建访问器实例方法。

例如:

card_status是external_printing_cards表中的一列,它将具有名为card_statuscard_status=访问器方法

由于ruby局部变量定义是动态的,所以行

 def after_find .... card_status = false if self.is_used_up? .... end 

将意味着我们正在定义和分配局部变量card_status而不是实例方法card_status=

Peer Allan发布的文章对此提供了更多解释。