ActiveRecord имеет несколько различных методов обратного вызова, используемых для упрощения логики модели. Например, методы after_find и before_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
Если я удалю все префиксы self из переменных экземпляра или методов экземпляра, эти вызовы будут вызваны, но они как локальные переменные внутри этих методов обратного вызова.
Эта переменная экземпляра (card_status), методы экземпляра (save!, is_used_up? и is_expired?) и ассоциация (user) отлично работали за пределами этих двух методов обратного вызова без префикса self.
Пример кода в документации Rails для методов обратного вызова (методы экземпляра), по-видимому, всегда использует префикс self, даже если он вызывает экземпляры или методы экземпляра, которые по праву они доступны без префикса self в нормальном режиме.
Я надеюсь, что кто-то, кто лучше понимает обратные вызовы ActiveRecord, может помочь пролить свет на это поведение.
Приветствия