Ruby on rails 为什么ActiveRecord回调要求实例变量或实例方法以self关键字作为前缀?
ActiveRecord有几种不同的回调方法用于简化模型逻辑。例如,查找方法后的Ruby on rails 为什么ActiveRecord回调要求实例变量或实例方法以self关键字作为前缀?,ruby-on-rails,activerecord,Ruby On Rails,Activerecord,ActiveRecord有几种不同的回调方法用于简化模型逻辑。例如,查找方法后的和创建方法前的 考虑以下代码示例: 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
和创建方法前的
考虑以下代码示例:
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
class ExternalPrintingCard
如果我从实例变量或实例方法中删除所有的self
前缀,则将调用这两个回调,但就好像它们是这些回调方法中的局部变量一样
此实例变量(card\u status
)、实例方法(save!
、已用完?
和已过期?
)和关联(user
)在这两种回调方法之外运行良好,没有self
前缀
Rails的回调方法(实例方法)文档中的示例代码似乎总是使用self
前缀,即使它正在调用实例变量或方法,它们通常不需要self
前缀就可以访问
我希望对ActiveRecord回调有更好理解的人能够帮助我们了解这种行为
干杯从技术上讲,你只需要在作业方法前使用自我。
这对于区分带有trailing=的实例方法和对局部变量的赋值是必要的。Nasmorn是正确的
ActiveRecord::Base将所有列名放置在@attributes
实例变量(哈希)中,并为这些列名创建访问器实例方法
例如:
card_status是external_printing_cards表中的一列,它将具有名为card_status
和card_status=
由于ruby局部变量定义是动态的,因此
def after_find
....
card_status = false if self.is_used_up?
....
end
这意味着我们正在定义并分配一个局部变量card\u status
,而不是实例方法card\u status=
Peer Allan发布的文章对此提供了更多解释。有关详细信息,请参阅这篇Thoughtbot文章: