module Sequel::Plugins::Auditer

Given a Post model with these fields:

[:id, :category_id, :title, :body, :author_id, :created_at, :updated_at]

All fields

plugin :auditer
  #=> [:category_id, :title, :body, :author_id]  # NB! excluding @default_ignore_attrs
  #=> [:id, :created_at, :updated_at]

Single field

plugin :auditer, only: :title
plugin :auditer, only: [:title]
  #=> [:title]
  #+> [:id, :category_id, :body, :author_id, :created_at, :updated_at] # ignored fields

Multiple fields

plugin :auditer, only: [:title, :body]
  #=> [:title, :body] # tracked fields
  #=> [:id, :category_id, :author_id, :created_at, :updated_at] # ignored fields

All fields except certain fields

plugin :auditer, except: :title
plugin :auditer, except: [:title]
  #=> [:id, :category_id, :author_id, :created_at, :updated_at] # tracked fields
  #=> [:title] # ignored fields

Public Class Methods

configure(model, opts = {}) click to toggle source

called when

# File lib/sequel/plugins/auditer.rb, line 98
def self.configure(model, opts = {})
  model.instance_eval do
    # add support for :dirty attributes tracking & JSON serializing of data
    plugin(:dirty)
    plugin(:json_serializer)
    plugin(:polymorphic)

    # set the default ignored columns or revert to defaults
    set_default_ignored_columns(opts)
    # sets the name of the current User method or revert to default: :current_user
    # specifically for the audited model on a per model basis
    set_user_method(opts)
    set_additional_info_method(opts)
    set_owner_method(opts)

    set_reference_method(opts)

    only    = opts.fetch(:only, [])
    except  = opts.fetch(:except, [])

    if only.empty? # except:
      # all columns minus any excepted columns and default ignored columns
      included_columns = [
        [columns - [except].flatten].flatten - @auditer_default_ignored_columns
      ].flatten.uniq

      # except_columns = except.empty? ? [] : [except].flatten
      excluded_columns = [columns - included_columns].flatten.uniq
      # excluded_columns = [columns - [except_columns, included_columns].flatten].flatten.uniq
    else
      # we should only track the provided column
      included_columns = [only].flatten
      # subtract the 'only' columns from all columns to get excluded_columns
      excluded_columns = columns - included_columns
    end

    @auditer_included_columns = included_columns
    @auditer_ignored_columns  = excluded_columns

    # each included model will have an associated versions
    one_to_many(
      :versions,
      class: audit_model_name,
      as: 'associated'
    )
  end
end