分享 save 和 create 的区别

towonzhou · 2013年07月17日 · 最后由 towonzhou 回复于 2013年07月17日 · 4452 次阅读

被人问到 before_save 和 before_create 的,听他的意思起始问得是 save 和 create 的区别。
于是看了下源码

def save(*)
  begin
    create_or_update
  rescue ActiveRecord::RecordInvalid
    false
  end
end

save 是调用 create_or_update 方法

def create_or_update
  raise ReadOnlyRecord if readonly?
  result = new_record? ? create : update
  result != false
end

new_record?方法判断记录是否不在数据库中,若数据库中没有,则返回 true
所以在 create_or_update 方法中,若数据库中无此记录,则是 create,若有则用 update

before_save 和 before_create 最大的一个区别就是,update 也算是 before_save。

#1 楼 @JeskTop 恩,是这个意思。只试过如果注册了 after_save,不管是 update 和 create 后,都会调用。
如果注册了 before_save, 调用 update 和 create 也都会调用 before_save 么?我试试看

#1 楼 @JeskTop 恩 还真是会都调用。

class Exercise < ActiveRecord::Base
  attr_accessible :code, :file_in, :file_out, :text, :title
  before_save :issave
  before_update :isupdate
  before_create :iscreate
  #validates :text, :length => { :is => 2 }
  #validates_length_of :text,  is: 2  

  def issave
    p "save"
  end

  def iscreate
    p "create"
  end 

  def isupdate
    p "update"
  end 
end

>>test = Exercise.create!(text: "ae") 输出的是 "save" "create"

>>test = Exercise.find(1) >>test = Exercise.update_attribute(:text, "hello") 输出的是 "save" "update"

需要 登录 后方可回复, 如果你还没有账号请 注册新账号