如何确定是否在after_save中创build或更新logging
#new_record? 函数确定是否保存了logging。 但是在after_save
钩子里总是假的。 有没有办法确定logging是新创build的logging还是更新的旧logging?
我希望不要使用另一个callback,如before_create
在模型中设置标志或需要另一个查询到数据库。
任何意见表示赞赏。
编辑:需要确定它在after_save
挂钩,并为我的特定用例,没有updated_at
或updated_on
时间戳
我正在寻找使用这个after_save
callback。
一个更简单的解决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_create
callback,只有当logging是一个新的logging,只有当它被保存后调用。 还有一个after_update
callback使用,如果这是一个现有的logging被更改和保存。 after_save
callback在两种情况下被调用, after_create
或after_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的。 希望有所帮助!