module Historiographer::HistoryMigrationMysql

Public Instance Methods

histories(except: [], only: [], no_business_columns: false) click to toggle source

class CreateAdGroupHistories < ActiveRecord::Migration

def change
  create_table :ad_group_histories do |t|
    t.histories
  end
end

end

t.histories(except: [“name”]) # don't include name column t.histories(only: [“name”]) # only include name column t.histories(no_business_columns: true) # only add history timestamps and history_user_id; manually add your own columns

Will automatically add user_id, history_started_at, and history_ended_at columns

# File lib/historiographer/history_migration_mysql.rb, line 19
def histories(except: [], only: [], no_business_columns: false)
  original_table_name = self.name.gsub(/_histories$/) {}.pluralize
  foreign_key         = original_table_name.singularize.foreign_key

  class_definer = Class.new(ActiveRecord::Base) do
  end

  class_name = original_table_name.classify
  klass      = Object.const_set(class_name, class_definer)
  original_columns = klass.columns.reject { |c| c.name == "id" || except.include?(c.name) || (only.any? && only.exclude?(c.name)) || no_business_columns }

  integer foreign_key.to_sym, null: false

  original_columns.each do |column|
    opts = {}
    opts.merge!(column.as_json.clone)

    send(column.type, column.name, opts.symbolize_keys!)
  end

  datetime :history_started_at, null: false
  datetime :history_ended_at
  integer :history_user_id

  index :history_started_at
  index :history_ended_at
  index :history_user_id
  index foreign_key

  ActiveRecord::Base.connection.indexes(original_table_name).each do |index|
    index index.columns
  end

end