vkill'blog

“技术本身没有太多价值,掌握了新的思考方式才是真的收获”

ActiveRecord 底层 save 之前执行 validation 的关键

22:15 , vkill
环境:ruby1.8.6、rails2.3.4
可能标题没表达清楚,就是说看到别人的笔记中看到说 activerecord 在 执行save 的时候底层是先执行了 validation 的,晚上看了下 base.rb 和 validations.rb 源码,才明白是用了alias_method_chain ,具体在 validations.rb 文件第370-378行和第76-82行,第77行执行了 valid? ,再看 valid? ,是执行了 validate 和 validate_on_create/validate_on_update

具体 alias_method_chain 是干嘛的,请看下面这两篇文章
Quotation

alias,alias_method和alias_method_chainhttp://hooney.javaeye.com/blog/550156
rails魔术字段的实现 ,alias_method_chain用法,for classmethodhttp://hooney.javaeye.com/blog/210244


那么我们就用 alias_method_chain 来模拟 save 前调用 validation

require 'rubygems'
require 'activesupport'
class Myclass
  def save
    puts 'save...'
  end
  def validation
    puts 'validation...'
  end
  def save_with_validation
    validation  #exec validation
    save_without_validation  #exec save
  end
  alias_method_chain :save, :validation
end
c=Myclass.new
c.save

类别:ruby & rails | Tags: , , | 0 条评论, 1251 次阅读
网友评论(0):
发表评论:

Nickname: 
Email:
Site URI: