before_create:
将在将新对象保存到数据库之前调用。当此方法返回 false 时,它将通过回滚来阻止创建。
因此,当您需要在保存前检查某些内容时,不适合验证,您可以在 before_create 中使用它们。
例如:在创建新的Worker 之前,请向Master 征求许可。
before_create :notify_master
def notify_master
# notify_master via ipc and
# if response is true then return true and create this successfully
# else return false and rollback
end
另一个用途是Trung Lê建议您在保存之前要格式化某些属性
比如大写名称等。
after_create:
第一次在数据库中保存对象后调用。只是当您不想中断创建并只是记下创建或在创建后触发某些内容时,这很有用。
例如:创建新的user 角色mod 后,我们要通知其他模组
after_create :notify_mod, :is_mod?
def notify_mod
# send notification to all other mods
end
编辑:以下评论
问:将notify_mod 放入after_create 而不是before_create 有什么好处?
答:有时在将对象保存到数据库时,由于数据库端验证或其他问题,它可能会回滚。
现在如果你在创建之前写了notify_mod,那么即使创建没有完成,它也会被处理。毫无疑问,它会回滚,但会产生开销。所以很费时间
如果你把它放在after_create 中,那么notify_mod 只会在记录创建成功时执行。从而减少发生回滚时的开销。
另一个原因是,通知必须在创建用户之后而不是之前发送是合乎逻辑的。