Welcome 微信登录

首页 / 软件开发 / JAVA / Rails开发细节(三)Participating in the Monitoring Process

Rails开发细节(三)Participating in the Monitoring Process2013-12-11 51cto virusswb译Participating in the Monitoring Process

参与监控过程

ActiveRecord控制着model对象 的生命周期,它创建它们,在修改,保存和更新的时候监控它们,并且在删除的时候也进行监控。使用回调函 数,ActiveRecord允许我们的代码参与这个监控过程。

ActiveRecord总共定义了20个回调函数。18个 成对的before和after,还有两个例外:after_find和after_initialize。

实现callback有两种方式。

第一种,直接在对象的回调方法中写代码。

class Order < ActiveRecord::Base def after_save self.payment_due ||= Time.now + 30.days end end
第二种,为回调声明一个处理器,处理器可以是一个方法,或者是一个block。

class Order < ActiveRecord::Base before_validation :normalize_credit_card_numberafter_create do |order| logger.info "Order #{order.id} created"endprotecteddef normalize_credit_card_number self.cc_number.gsub!(/[-s]/, "") end end
你可以为一个回调函数指定多个处理程序,多个处理程序会按照指定的顺序执行,除非其中一个处理程序 返回false,这时候才会终止后面的处理程序。

因为需要优化性能,定义after_find和 after_initialize只能用方法的方式,如果使用其他方式,定义的处理程序会被忽略。

Grouping Related Callbacks Together

callback分组

可以将相关的callback处理方法定义在单独的类中 ,这样这些处理方法就可以在多个model中共享。一个处理类就是在一个类中定义回调方法,把这些类放在 app/models文件夹中。

class CreditCardCallbacks def before_validation(model) model.cc_number.gsub!(/[-s]/, "") end endclass Order < ActiveRecord::Base before_validation CreditCardCallbacks.newendclass Subscription < ActiveRecord::Base before_validation CreditCardCallbacks.newend
上面的CreditCardCallbacks的before_validation就是共享的,这需要Order和Subscription都包含 cc_number属性。共享的处理程序,需要处理相同的属性,肯定需要共享处理程序的model有相同名称的属性。