是:on => :在Rails 3.2.3中为before_save回调创建有效

时间:2012-05-17 17:06:08

标签: ruby-on-rails activerecord ruby-on-rails-3.2 before-save

如您所知,before_save回调是在before_create回调之前执行的。

因此,有些人建议使用before_save :method, :on => :create而不是before_create会更好,这样回调方法会在适当的时间执行,与其他回调相关(例如自动保存回调) 。例如,请参阅此Pivotal Labs blog postthis StackOverflow answer

但是,据我所知,:on => :create选项无法实现before_save回调的预期效果。换句话说,无论是否为创建,都会为每次保存执行回调。

:on => :create选项确实似乎对before_validation回调有效。

有人可以确认:on => :create是否应该适用于before_save?它是否在以前的Rails版本中有效并且现在已经损坏,或者前面提到的链接是错误的?

假设:on => :create无效,以下是否可接受,和/或是否有更好的方式?

before_save :callback_method, :if => :new_record?

谢谢。

1 个答案:

答案 0 :(得分:17)

你是对的,:on回调没有before_save选项。 但是,我不明白,为什么使用before_save代替before_createbefore_create之后将立即调用before_save回调。

当然,您可以使用before_save :callback_method, :if => :new_record?。但我个人不喜欢这个解决方案 - 如果我需要在:if选项中添加条件怎么办?

如果一个人在before_savebefore_create回调之间存在依赖关系,我建议合并两个回调。例如(伪代码):

class MyModel < ActiveRecord::Base
  before_create :prepare_x
  before_save :do_something_with_x

  def prepare_x
    @x = 10
  end


  # will not work, because `prepare_x` called after `do_something_with_x`
  def do_something_with_x
    @a = 100 / @x
  end
end

# ||
# ||
# \/

class MyModel < ActiveRecord::Base

  before_save :do_something_with_x

  def do_something_with_x
    @x = 10 if new_record?
    @a = 100 / @x
  end
end