Rails - how to use reload method?
I think your understanding of how save
and reload
work is basically correct. Your results certainly seem to be inconsistent. I have a feeling based on your results that your save
is failing.
save
will try to store the local version to the database. It does not refresh any values from the database if the model has changed since you loaded it. If the save
fails, the local values are still whatever you set them to, but the database will have the old values.
reload
overwrites any local changes you have made and sets them to the database values.
Assuming there is no contention on the database for the models you are concerned with, let's walk through your examples.
Example 1
If the save
works, then the reload
will not do anything and the value of visit.status_id
will be Status.last.id
. However, if the save
fails then the value of visit.status_id
will be whatever it was in the database originally.
Example 2
If the create
does not work then the reload
would give a RecordNotFound
error because you can't reload
something that hasn't been persisted. After that you set the status_id
to 2 and then call save
. Whether the save
succeeds or fails, the local value of status_id
will remain as 2. However, the database value depends on whether it passed or failed.
Example 3 Hey! This is the same as example 2 except for the reload.
Here is some documentation, but I'm not sure how helpful you will find it: http://apidock.com/rails/ActiveRecord/Persistence/save
http://apidock.com/rails/ActiveRecord/Persistence/reload
You might want to check for save
success or call save!
to ensure the save
is actually working.
I hope that helps.
Comments
-
nishanthan almost 2 years
Case1: Creating a new record for a model with assigning the associated object(Status object instead of Status.id) like
visit = Visit.create(:date => Date.today, :status => Status.first) visit.status_id #=> 1
After creating the record
I'm trying to update the attribute 'status_id' (Status.id instead of Status object) but it returns the old value even calling reload after save the object. Example:
visit.status_id = Status.last.id visit.save visit.reload visit.status_id #=> 1
When I calling reload method after create it is working as expected
visit = Visit.create(:date => Date.today, :status => Status.first) visit.status_id #=> 1 visit.reload visit.status_id = 2 visit.save visit.status_id #=> 2
Case2: If I assigning the 'status_id' value instead of Status object, then no need to reload object and its working fine
visit = Visit.create(:date => Date.today, :status_id => Status.first.id) visit.status_id #=> 1 visit.status_id = 2 visit.save visit.status_id #=> 2
Using the two cases above, when should I use the
reload
method? Should it be before or aftersave
? -
nishanthan over 11 yearsThanks for the answer, according to ur example 1 when i'm saving the record in console it returns true and also there is no any errors for the object(table has the new record), now i'm updating the value (without reloading the record) it is not updated, If the updation should done, i've to reload and then edit the value then the record is updated with new value