Track changes in your active record object using Dirty Objects in Rails

If you want to track whether your active record objects have been modified or not. It becomes a lot easier with the dirty object functionality. It’s pretty straightforward and clean.

  article = Article.first
  article.changed?  #=> false

  # Track changes to individual attributes with# attr_name_changed? accessor
  article.title  #=> "Title"
  article.title = "New Title"
  article.title_changed? #=> true

  # Access previous value with attr_name_was accessor
  article.title_was  #=> "Title"

  # See both previous and current value with attr_name_change accessor
  article.title_change  #=> ["Title", "New Title"]

You can also query to object directly for its list of all changed attributes.

  # Get a list of changed attributes
  article.changed  #=> ['title']
  # Get the hash of changed attributes and their previous and current values
  article.changes  #=> { 'title' => ["Title", "New Title"] }

Once you save a dirty object it clears out its changed state tracking and is once again considered unchanged.

  article.changed?  #=> true
  article.save  #=> truearticle.changed?  #=> false

If you’re going to be modifying an attribute outside of the attr= writer, you can use attr_name_will_change! to tell the object to be aware of the change:

  article = Article.first
  article.title_will_change!
  article.title.upcase!
  article.title_change  #=> ['Title', 'TITLE']