Echo nil > me

Bleach me and begin again

ActiveRecord-ORM of Rails(2)

| Comments

这两天重装系统,没做什么事情,装系统现在已经很快了,只是还在做好多的后续工作,回头再写篇总结好了。先写之前剩下的一篇。这次是聊点ActiveRecord的callback。

Monitor

ActiveRecord控制model的生命周期,包括他们的CRUD(《Agile..》上很风趣地说是watches sadly as they are destroyed. haha)。

而在这过程中的许多时刻我们都可以通过callbacks来进行一些操作.

ActiveRecord定义了十六个回调函数,十四个是before/after_func的形式,分别在一些函数之前或之后被调用,如destory, validation,两个特别的是after_find以及after_initialize,这两个没有对应的before。

他们的流程如下:

做个简单的解释,save()会产生两种行为,一种是新产生,一种是更新。而这两种行为可以通过before_validationafter_validation等的方法加上参数on: createon: update来决定是哪种。

而之前提到的after_find是在任何find操作后会调用,after_initialize则会在一个Active Record的对象产生后调用。我的理解是,比如Model.new()这个只是产生了一个ActiveRecord对象,并没有save,所以调用after_initialize

怎么用呢? 我们需要写一个handler和一个与它关联的相应的回调函数。

比如:

1
2
3
4
5
6
7
8
9
10
class Order < ActiveRecord::Base
  before_validation :normalize_credit_card_number
  after_create do |order|
    logger.info "Order #{order.id} created"
  end
  protected
  def normalize_credit_card_number
    self.cc_number.gsub!(/[-\s]/, '')
  end
end

before_validation normalize_credit_card_number中声明了一个handler并把它关联到before_validation这个事件中。然后再定义一个函数就行,这个函数最好是private或protected的。

Comments