Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

How to determine if any field in a model / nested model changed?

Is there some quick way to find out if any of a model's fields or any fields of it's nested models (a.k.a. associations) changed?

like image 429
Zabba Avatar asked Apr 11 '11 00:04

Zabba


4 Answers

To see if a ActiveRecord object has changed, you can call:

instance.changed?

To see if a specific attribute was changed, you can do:

instance.attr_changed?

where attr is the attribute you want to check.

To check for if a nested model changed, you can just do:

instance.nested_model.changed?
like image 147
Mike Lewis Avatar answered Nov 11 '22 00:11

Mike Lewis


I know this is old question but recently came across same situation.

You can get all changes for your nested model using previous_changes method even after saving the object.

parent_model_object.nested_model_name.previous_changes

This will list all changes in the nested model along with old and new value.

like image 37
Prajakta Avatar answered Nov 11 '22 00:11

Prajakta


with 5.1 + the following works for me:

saved_changes? will let you know if your object has changed:

my_object.saved_changes?
=> true

saved_changes will let you know which fields changed, the before value and the after value for each field:

my_object.saved_changes
=> {"first_name"=>['Jim', 'Jimmy'], "updated_at"=>[Thu, 06 Dec 2018 18:45:00 UTC +00:00, Thu, 06 Dec 2018 18:52:44 UTC +00:00]}
like image 7
Steve Avatar answered Nov 10 '22 23:11

Steve


You can determine if an object has changed but not yet been saved by calling:

my_object.changed?

You can also determine if individual attributes have changed (say you have a first_name attribute):

my_object.first_name_changed?

As far as nested models go, I think you'd have to call changed? on them each individually.

like image 4
Andrew Marshall Avatar answered Nov 11 '22 00:11

Andrew Marshall