Sam*_*dra 18 activerecord ruby-on-rails
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
Run Code Online (Sandbox Code Playgroud)
如果我self从实例变量或实例方法中删除所有前缀,那么将调用这两个回调,但就好像它们是这些回调方法中的局部变量一样.
这个实例变量(card_status),实例方法(save!,is_used_up?和is_expired?)和association(user)在没有self前缀的这两个回调方法之外工作正常.
Rails文档中用于回调方法(实例方法)的示例代码似乎总是使用self前缀,即使它正在调用实例变量或方法,正确地说它们可以在没有self前缀的情况下访问.
我希望有更好理解ActiveRecord回调的人可以帮助揭示这种行为.
干杯
nas*_*orn 15
从技术上讲,您只需要在分配方法前使用self.这对于区分具有trailing =的实例方法和对局部变量的赋值是必要的.
纳斯莫恩是正确的。
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
Run Code Online (Sandbox Code Playgroud)
将意味着我们正在定义并分配给局部变量card_status而不是实例方法card_status=
Peer Allan 发表的文章对此提供了更多解释。
| 归档时间: |
|
| 查看次数: |
2947 次 |
| 最近记录: |