如您所知,before_save
回调是在before_create
回调之前执行的。
因此,有些人建议使用before_save :method, :on => :create
而不是before_create
会更好,这样回调方法会在适当的时间执行,与其他回调相关(例如自动保存回调) 。例如,请参阅此Pivotal Labs blog post和this StackOverflow answer。
但是,据我所知,:on => :create
选项无法实现before_save
回调的预期效果。换句话说,无论是否为创建,都会为每次保存执行回调。
:on => :create
选项确实似乎对before_validation
回调有效。
有人可以确认:on => :create
是否应该适用于before_save
?它是否在以前的Rails版本中有效并且现在已经损坏,或者前面提到的链接是错误的?
假设:on => :create
无效,以下是否可接受,和/或是否有更好的方式?
before_save :callback_method, :if => :new_record?
谢谢。
答案 0 :(得分:17)
你是对的,:on
回调没有before_save
选项。
但是,我不明白,为什么使用before_save
代替before_create
。
before_create
之后将立即调用before_save
回调。
当然,您可以使用before_save :callback_method, :if => :new_record?
。但我个人不喜欢这个解决方案 - 如果我需要在:if
选项中添加条件怎么办?
如果一个人在before_save
和before_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