class HasArchive::MigrationManager

Public Class Methods

create_archive_for(model) click to toggle source
# File lib/has_archive/migration_manager.rb, line 5
    def self.create_archive_for(model)
      @table_name = model.table_name

      fail MigrationExistsException.new(@table_name) if Dir["db/migrate/*_create_archive_for_#{@table_name}.rb"].any?

      template = <<-MIGRATION
class CreateArchiveFor#{@table_name.camelize} < ActiveRecord::Migration
  def change
    create_table :#{@table_name.singularize}_archives do |t|
#{columns.map {|c| build_column(c) }.join("\n") }
      t.datetime    :archived_at,    null: false
    end

#{indexes.map {|i| build_index(i) }.join("\n") }
  end
end\n
MIGRATION

      File.write("db/migrate/#{file_name('create_archive_for')}", template)
    end
update_archive_for(model) click to toggle source
# File lib/has_archive/migration_manager.rb, line 26
def self.update_archive_for(model)
  @table_name = model.table_name
end

Private Class Methods

build_column(c) click to toggle source
# File lib/has_archive/migration_manager.rb, line 40
def self.build_column(c)
  limit = c.limit ? ",        limit: #{c.limit}" : ''
  "      t.#{c.type}#{' ' * (12 - c.type.size)}:#{c.name}#{limit}"
end
build_index(i) click to toggle source
# File lib/has_archive/migration_manager.rb, line 45
def self.build_index(i)
  # unique  = i.unique ? ', unique: true' : ''
  columns = i.columns.one? ? ":#{i.columns.first}" : i.columns.map(&:to_sym)
  # "    add_index :#{@table_name}, :#{columns}#{unique}"
  "    add_index :#{@table_name.singularize}_archives, #{columns}"
end
columns() click to toggle source
# File lib/has_archive/migration_manager.rb, line 32
def self.columns
  ActiveRecord::Base.connection.columns(@table_name).select {|c| c.name != 'id' }
end
file_name(action) click to toggle source
# File lib/has_archive/migration_manager.rb, line 52
def self.file_name(action)
  action = action.underscore.gsub(/\s+/, '_')
  # TODO: figure out how number argument is actually supposed to be used
  "#{ActiveRecord::Migration.next_migration_number(1)}_#{action}_#{@table_name}.rb"
end
indexes() click to toggle source
# File lib/has_archive/migration_manager.rb, line 36
def self.indexes
  ActiveRecord::Base.connection.indexes(@table_name)
end