如何确定是否在after_save中创build或更新logging

#new_record? 函数确定是否保存了logging。 但是在after_save钩子里总是假的。 有没有办法确定logging是新创build的logging还是更新的旧logging?

我希望不要使用另一个callback,如before_create在模型中设置标志或需要另一个查询到数据库。

任何意见表示赞赏。

编辑:需要确定它在after_save挂钩,并为我的特定用例,没有updated_atupdated_on时间戳

我正在寻找使用这个after_savecallback。

一个更简单的解决scheme是使用id_changed? (因为它不会update ),甚至created_at_changed? 如果时间戳列存在。

更新:正如@mitsy指出,如果这个检查是需要callback之外,然后使用id_previously_changed? 。 看文档 。

我知道这里没有铁轨魔法,你必须自己动手。 你可以使用虚拟属性清理这个…

在你的模型类中:

 def before_save @was_a_new_record = new_record? return true end def after_save if @was_a_new_record ... end end 

还有另一种select,对于那些有更新时间戳的人:

 if created_at == updated_at # it's a newly created record end 

有一个after_createcallback,只有当logging是一个新的logging,只有当它被保存后调用。 还有一个after_updatecallback使用,如果这是一个现有的logging被更改和保存。 after_savecallback在两种情况下被调用, after_createafter_update被调用后。

如果您需要在保存新logging后发生一次事件,请使用after_create

更多信息: http : //api.rubyonrails.org/classes/ActiveRecord/Callbacks.html

由于该对象已被保存,因此您需要查看以前的更改。 ID只能在创build后才能更改。

 # true if this is a new record @object.previous_changes[:id].any? 

还有一个实例variables@new_record_before_save 。 您可以通过执行以下操作来访问它:

 # true if this is a new record @object.instance_variable_get(:@new_record_before_save) 

两者都非常丑陋,但他们会让你知道对象是否是新创build的。 希望有所帮助!