PaperTrail

· Padrão Banco de Dados
Juan Kalleo
Juan Kalleo
Backend/API
This page hasn't been translated to English yet — showing the original Portuguese content.

O que é

Gem de versionamento pra ActiveRecord — grava uma linha numa tabela versions a cada create/update/destroy de qualquer model que inclua has_paper_trail, guardando o estado anterior do registro e quem fez a mudança.

Por que essa

A gem de versionamento mais madura do ecossistema Rails, incluída direto em ApplicationRecord — todo model do projeto ganha histórico completo sem precisar declarar nada individualmente. Ver Modelagem base pro funcionamento completo, e Logs de auditoria no Padrão Frontend pra API/tela que expõe esse dado.

Versão

paper_trail (17.0.0)Gemfile.lock.

Como importar

# Gemfile
gem "paper_trail"
bin/rails g paper_trail:install
bin/rails db:migrate

O gerador cria a migration da tabela versions — sem rodar isso primeiro, has_paper_trail falha em runtime (não no boot) com relation "versions" does not exist, no primeiro create/update que tentar gravar uma versão.

Exemplo real

# app/models/application_record.rb
has_paper_trail

before_save :set_paper_trail_whodunnit

def set_paper_trail_whodunnit
  PaperTrail.request.whodunnit = Current.user&.id&.to_s
end

Schema real da tabela que a gem gera e usa:

create_table "versions", force: :cascade do |t|
  t.string "whodunnit"
  t.datetime "created_at"
  t.bigint "item_id", null: false
  t.string "item_type", null: false
  t.string "event", null: false
  t.text "object"
end

Onde usar no projeto

Toda tabela, via ApplicationRecord — sem exceção, sem opt-out por model. PaperTrail::Version herda de ActiveRecord::Base direto (a gem), não de ApplicationRecord — evitar dar nome de classe/arquivo próprio que colida com o namespace PaperTrail:: é necessário (o Zeitwerk auto-vivifica o módulo a partir do caminho da pasta antes da gem carregar a classe real, e a colisão quebra com TypeError: Version is not a class).