Have you considered using acts_as_versioned ?
http://wiki.rubyonrails.org/rails/pages/ActsAsVersioned