[Ruby on Rails] Model Version Control Using Papertrail

Why use papertrail ?

ruby toolbox - active record versioning

Step1. Add lib

Gemfile

gem 'paper_trail', '~> 3.0.6'

Step2. create a migration

On Terminal

bundle exec rails generate paper_trail:install

他會建立,一個叫做versions的表

Step3. migrate

bundle exec rake db:migrate

Step4. Done

has_paper_trail 加上你想要追蹤的model

應用部分

若是想要不同model使用不同追蹤table?

假設我想要product有自己的versions表

  • Step1.

      rails g model product_version 
    
  • 貼上

      class CreateProductVersions < ActiveRecord::Migration
        def change
          create_table :product_versions do |t|
            t.string   :item_type, :null => false
            t.integer  :item_id,   :null => false
            t.string   :event,     :null => false
            t.string   :whodunnit
            t.text     :object
            t.datetime :created_at
            # t.string   :author_username 如果你需要自訂一些欄位讓他記錄,也可以在migration這邊加
          end
          add_index :product_versions, [:item_type, :item_id]
          end
        end
      end
    

ps. 這就是他本身內建會產生的欄位,只是我們手動把它copy一份出來

  • 別忘了

      bundle exec rake db:migrate
    
  • 改model ProductVersion

      class ProductVersion < PaperTrail::Version
        self.table_name = :product_versions
      end
    
  • 改model Product

      class Product < ActiveRecord::Base
          ...
          has_paper_trail class_name: 'ProductVersion'
          ...
      end
    

若是想要知道誰動了資料?

假設你有使用devise,然後是寫在後台

請加在 controller/admin/admin_controller.rb

def user_for_paper_trail
    admin_signed_in? ? current_admin.email : 'System'
end

假使你在前台,你可能需要這樣寫

def user_for_paper_trail
    user_signed_in? ? current_user.email : 'Public User'
end

若某個動作不想被追蹤

@product.without_versioning do
  @product.update_attributes :created_at => Time.now
end

若要刪除某個versions從哪天到某天

方法一:下SQL

delete from versions where created_at < 2014-01-01;

方法二:在rails c底下

PaperTrail::Version.delete_all ["created_at < ?", 1.year.ago]
Comments

Comments

Google Analytics Alternative