Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

How to detect attribute changes from model?

I'd like to create a callback function in rails that executes after a model is saved.

I have this model, Claim that has a attribute 'status' which changes depending on the state of the claim, possible values are pending, endorsed, approved, rejected

The database has 'state' with the default value of 'pending'.

I'd like to perform certain tasks after the model is created on the first time or updated from one state to another, depending on which state it changes from.

My idea is to have a function in the model:

    after_save :check_state      def check_state       # if status changed from nil to pending (created)       do this        # if status changed from pending to approved       performthistask      end 

My question is how do I check for the previous value before the change within the model?

like image 267
David C Avatar asked Oct 19 '09 01:10

David C


2 Answers

You should look at ActiveModel::Dirty module: You should be able to perform following actions on your Claim model:

claim.status_changed?  # returns true if 'status' attribute has changed claim.status_was       # returns the previous value of 'status' attribute claim.status_change    # => ['old value', 'new value'] returns the old and                         # new value for 'status' attribute  claim.name = 'Bob' claim.changed # => ["name"] claim.changes # => {"name" => ["Bill", "Bob"]} 

Oh! the joys of Rails!

like image 114
Harish Shetty Avatar answered Sep 20 '22 08:09

Harish Shetty


you can use this

self.changed 

it return an array of all columns that changed in this record

you can also use

self.changes 

which returns a hash of columns that changed and before and after results as arrays

like image 45
zeacuss Avatar answered Sep 17 '22 08:09

zeacuss