Answers:
我一直在寻找将其用于after_save
回调。
使用更简单的解决方案id_changed?
(因为它不会在上更改update
),或者即使created_at_changed?
存在时间戳列也可以使用。
更新:@mitsy指出,如果在回调之外需要此检查,请使用id_previously_changed?
。参见docs。
after_save
。
id_changed?
保存记录后(至少在挂钩之外)将为false。在这种情况下,您可以使用id_previously_changed?
另一种选择,对于那些谁做有一个updated_at
时间戳:
if created_at == updated_at
# it's a newly created record
end
created_at
等于它?” updated_at
after_save
created_at
并且updated_at
将在平等的after_save
回调。在所有其他情况下,它们在after_save
回调中将不相等。
保存后,after_create
只有在记录为新记录时才有一个回调。如果这是已更改并保存的现有记录,则还有一个回调供使用。该回调被称为在这两种情况下,无论是后还是被调用。after_update
after_save
after_create
after_update
after_create
如果在保存新记录后需要进行某些操作,请使用此选项。
此处提供更多信息:http : //api.rubyonrails.org/classes/ActiveRecord/Callbacks.html
由于对象已经保存,因此您需要查看之前的更改。该ID仅应在创建后更改。
# true if this is a new record
@object.previous_changes[:id].any?
还有一个实例变量@new_record_before_save
。您可以通过执行以下操作来访问它:
# true if this is a new record
@object.instance_variable_get(:@new_record_before_save)
两者都很丑陋,但是它们会让您知道对象是否是新创建的。希望有帮助!
after_save
使用Rails 4 的回调中处于byebug中,但这些都不在识别该新记录。
@object.previous_changes[:id].any?
很简单而优雅。记录更新后,它对我有用(我不从中调用它after_save
)。
@object.id_previously_changed?
有点不那么丑。
after_save
您想查看的是Rails 4上的@MCB changes[:id]
而不是previous_changes[:id]
。这是改变Rails5.1但是(见讨论github.com/rails/rails/pull/25337)
previous_changes.key?(:id)
以获得更好的理解。
对于Rails 4(在4.2.11.1上选中),结果changes
和previous_changes
方法{}
在创建对象内部时都是空散列after_save
。因此attribute_changed?
类似的方法id_changed?
将无法按预期工作。
但是您可以利用此知识,并且-知道至少1个属性必须在changes
更新中-检查是否changes
为空。一旦确认它为空,就必须在对象创建过程中:
after_save do
if changes.empty?
# code appropriate for object creation goes here ...
end
end