问题
The #new_record? function determines if a record has been saved. But it is always false in the after_save
hook. Is there a way to determine whether the record is a newly created record or an old one from update?
I'm hoping not to use another callback such as before_create
to set a flag in the model or require another query into the db.
Any advice is appreciated.
Edit: Need to determine it in after_save
hook, and for my particular use case, there is no updated_at
or updated_on
timestamp
回答1:
I was looking to use this for an after_save
callback.
A simpler solution is to use id_changed?
(since it won't change on update
) or even created_at_changed?
if timestamp columns are present.
Update: As @mitsy points out, if this check is needed outside of callbacks then use id_previously_changed?
. See docs.
回答2:
No rails magic here that I know of, you'll have to do it yourself. You could clean this up using a virtual attribute...
In your model class:
def before_save
@was_a_new_record = new_record?
return true
end
def after_save
if @was_a_new_record
...
end
end
回答3:
Yet another option, for those who do have an updated_at
timestamp:
if created_at == updated_at
# it's a newly created record
end
回答4:
There is an after_create
callback which is only called if the record is a new record, after it is saved. There is also an after_update
callback for use if this was an existing record which was changed and saved. The after_save
callback is called in both cases, after either after_create
or after_update
is called.
Use after_create
if you need something to happen once after a new record has been saved.
More info here: http://api.rubyonrails.org/classes/ActiveRecord/Callbacks.html
回答5:
Since the object has already been saved, you would you need to look at the previous changes. The ID should only change after a create.
# true if this is a new record
@object.previous_changes[:id].any?
There is also an instance variable @new_record_before_save
. You can access that by doing the following:
# true if this is a new record
@object.instance_variable_get(:@new_record_before_save)
Both are pretty ugly, but they would allow you to know whether the object has been newly created. Hope that helps!
来源:https://stackoverflow.com/questions/4975106/how-to-determine-if-a-record-is-just-created-or-updated-in-after-save