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
前缀,即使它正在调用实例变量或方法,它们可以在没有{{{ 1}}正常的前缀。
我希望有更好理解ActiveRecord回调的人可以帮助揭示这种行为。
干杯
答案 0 :(得分:15)
从技术上讲,您只需要在分配方法前使用self。 这对于区分具有trailing =的实例方法和对局部变量的赋值是必要的。
答案 1 :(得分:2)
纳斯莫恩是对的。
ActiveRecord :: Base将所有列名放在@attributes
实例变量(Hash)中,并为这些列名创建访问器实例方法。
例如:
card_status是external_printing_cards表中的一列,它将具有名为card_status
和card_status=
的访问者方法
由于ruby局部变量定义是动态的,行
def after_find
....
card_status = false if self.is_used_up?
....
end
意味着我们正在定义和分配局部变量card_status
而不是实例方法card_status=
Peer Allan发布的文章对此提供了更多解释。