#177 Model Versioning
Aug 31, 2009 | 9 minutes | Active Record, Plugins
If you need to keep track of a model's history of changes and switch between versions, consider using the vestal_versions gem like I show in this episode.
- Download:
- source codeProject Files in Zip (87.1 KB)
- mp4Full Size H.264 Video (12.4 MB)
- m4vSmaller H.264 Video (9.04 MB)
- webmFull Size VP8 Video (25.1 MB)
- ogvFull Size Theora Video (18.7 MB)
Resources
bash
sudo rake gems:install
script/generate vestal_versions_migration
script/generate migration version_existing_pages
rake db:migrate
sudo rake gems:install script/generate vestal_versions_migration script/generate migration version_existing_pages rake db:migrate
config/environment.rb
config.gem 'laserlemon-vestal_versions', :lib => 'vestal_versions', :source => 'http://gems.github.com'
config.gem 'laserlemon-vestal_versions', :lib => 'vestal_versions', :source => 'http://gems.github.com'
models/page.rb
class Page < ActiveRecord::Base
versioned
end
# version_existing_pages migration
say_with_time "Setting initial version for pages" do
Page.find_each(&:touch)
end
class Page < ActiveRecord::Base versioned end # version_existing_pages migration say_with_time "Setting initial version for pages" do Page.find_each(&:touch) end
pages_controller.rb
def show
@page = Page.find(params[:id])
@page.revert_to(params[:version].to_i) if params[:version]
end
def show @page = Page.find(params[:id]) @page.revert_to(params[:version].to_i) if params[:version] end
script/console
p = Page.all
p.versions
p.revert_to(7.minutes.ago)
p.content
p.revert_to(:last)
p = Page.all p.versions p.revert_to(7.minutes.ago) p.content p.revert_to(:last)
rhtml
<p>
<%= link_to "Edit", edit_page_path(@page) %>
| Version <%= @page.version %>
<% if @page.version > 1 %>
| <%= link_to "Previous version", :version => @page.version-1 %>
<% end %>
<% if params[:version] %>
| <%= link_to "Latest version", :version => nil %>
<% end %>
</p>
<p> <%= link_to "Edit", edit_page_path(@page) %> | Version <%= @page.version %> <% if @page.version > 1 %> | <%= link_to "Previous version", :version => @page.version-1 %> <% end %> <% if params[:version] %> | <%= link_to "Latest version", :version => nil %> <% end %> </p>

