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_atafter_save
created_at并且updated_at将在平等的after_save回调。在所有其他情况下,它们在after_save回调中将不相等。
保存后,after_create只有在记录为新记录时才有一个回调。如果这是已更改并保存的现有记录,则还有一个回调供使用。该回调被称为在这两种情况下,无论是后还是被调用。after_updateafter_saveafter_createafter_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