class MigrationGenerator

Generates a migration that renames columns and tables

Public Class Methods

new(old_name_plural:, new_name_plural:, old_name_singular:, new_name_singular:) click to toggle source
# File lib/model_renamer/migration_generator.rb, line 6
def initialize(old_name_plural:, new_name_plural:, old_name_singular:, new_name_singular:)
  @old_name_plural = old_name_plural
  @new_name_plural = new_name_plural
  @old_name_singular = old_name_singular
  @new_name_singular = new_name_singular
end

Public Instance Methods

create_migration_file() click to toggle source
# File lib/model_renamer/migration_generator.rb, line 13
def create_migration_file
  path = Rails::Generators.invoke("active_record:migration", [migration_name])[0]
  File.write(path, migration_file_content)
end

Private Instance Methods

migration_file_content() click to toggle source
# File lib/model_renamer/migration_generator.rb, line 20
  def migration_file_content
"""class #{migration_name} < ActiveRecord::Migration
  def change
    #{rename_statements.join("\n    ")}
  end
end
"""
  end
migration_name() click to toggle source
# File lib/model_renamer/migration_generator.rb, line 29
def migration_name
  "Rename#{@old_name_singular.split('_').map(&:capitalize).join}To#{@new_name_singular.split('_').map(&:capitalize).join}"
end
rename_column(table_name, column_name) click to toggle source
# File lib/model_renamer/migration_generator.rb, line 54
  def rename_column table_name, column_name
    if column_name.include?(@old_name_plural)
"""if table_exists?(:#{table_name}) && column_exists?(:#{table_name}, :#{column_name})
      rename_column :#{table_name}, :#{column_name}, :#{column_name.gsub(@old_name_plural, @new_name_plural)}
    end
"""
    elsif column_name.include?(@old_name_singular)
"""if table_exists?(:#{table_name}) && column_exists?(:#{table_name}, :#{column_name})
      rename_column :#{table_name}, :#{column_name}, :#{column_name.gsub(@old_name_singular, @new_name_singular)}
    end
"""
    end
  end
rename_statements() click to toggle source

[

'rename_column :table_1, :old_name_1, :new_name_1',
'rename_column :table_1, :old_name_2, :new_name_2',
'rename_table :table_1, :new_table_1',
...

]

# File lib/model_renamer/migration_generator.rb, line 48
def rename_statements
  @rename_statements ||= tables_hash.map do |table_name, columns|
    columns.map { |column| rename_column(table_name, column) } << rename_table(table_name)
  end.flatten.compact
end
rename_table(table_name) click to toggle source
# File lib/model_renamer/migration_generator.rb, line 68
  def rename_table table_name
    if table_name.include?(@old_name_plural)
"""if table_exists?(:#{table_name})
      rename_table :#{table_name}, :#{table_name.gsub(@old_name_plural, @new_name_plural)}
    end
"""
    elsif table_name.include?(@old_name_singular)
"""if table_exists?(:#{table_name})
      rename_table :#{table_name}, :#{table_name.gsub(@old_name_singular, @new_name_singular)}
    end
"""
    end
  end
tables_hash() click to toggle source

{

"table_1_name" => ["column_1", column_2, ...],
"table_2_name" => ["column_1", column_2, ...],
...

}

# File lib/model_renamer/migration_generator.rb, line 38
def tables_hash
  @tables_hash ||= Hash[ ActiveRecord::Base.connection.tables.collect { |table| [table, ActiveRecord::Base.connection.columns(table).map(&:name)] } ]
end