Store all attribute changes for active record objects during a transaction so that they are available in an after_commit callbacks.
Note that using previous_changes in an after_commit hook will only return the attribute changes from the last time the record was saved, which won't include all the changes made to the record in the transaction if the record was saved multiple times in the same transaction. Use this gem to solve this problem.
Add this line to your application's Gemfile:
gem 'ar_transaction_changes'
And then execute:
$ bundle
Or install it yourself as:
$ gem install ar_transaction_changes
Just include ArTransactionChanges and transaction_changed_attributes will store the original values for all the changed attributes throughout the transaction.
class User < ActiveRecord::Base
include ArTransactionChanges
after_commit :print_transaction_changes
def print_transaction_changes
transaction_changed_attributes.each do |name, old_value|
puts "attribute #{name}: #{old_value.inspect} -> #{send(name).inspect}"
end
end
end
ar_transaction_changes
may have conflict with another gems who modify
active_record#write_attribute
method, e.g. globalize
gem
the workaround is by requiring this gem first, for example:
gem 'ar_transaction_changes', require: false
gem 'globalize', require: ['ar_transaction_changes', 'globalize']
- Fork it
- Create your feature branch (
git checkout -b my-new-feature
) - Commit your changes (
git commit -am 'Add some feature'
) - Push to the branch (
git push origin my-new-feature
) - Create new Pull Request