Nat*_*han 8 activerecord ruby-on-rails before-save ruby-on-rails-3.2
如您所知,before_save回调在before_create回调之前执行.
因此,有些人建议使用in before_save :method, :on => :create而不是before_create使得回调方法在适当的时间执行与其他回调(例如自动保存回调)相关.例如,请参阅此Pivotal Labs博客文章以及此StackOverflow答案.
但是,据我所知,该:on => :create选项无法实现对before_save回调的预期效果.换句话说,无论是否为创建,都会为每次保存执行回调.
该:on => :create选项也似乎是有效的before_validation回调,虽然.
有人可以确认是否:on => :create应该适用于before_save?它是否在以前的Rails版本中有效并且现在已经坏了,或者前面提到的链接是错误的?
假设:on => :create无效,以下是否可接受,和/或有更好的方法吗?
before_save :callback_method, :if => :new_record?
Run Code Online (Sandbox Code Playgroud)
谢谢.
cut*_*ion 17
你说得对,没有:on供选择before_save回调.但是,我不明白,为什么要用before_save而不是before_create.
before_create回调将在之后立即调用before_save.
当然,你可以使用before_save :callback_method, :if => :new_record?.但我个人不喜欢这个解决方案 - 如果我需要在:if选项中添加条件怎么办?
如果一个人在回调before_save和before_create回调之间存在依赖关系,我建议组合2个回调.例如(伪代码):
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
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
11024 次 |
| 最近记录: |