If you want to create a migration file from a module written in lib file or somewhere from your ruby file and execute it, use the metaprogramming which can create a class or method dynamically. The following code snippet shows the methods we use and gives a better idea to create migration file dynamically.
def create_columns(tb_with_cols)
add_columns = ""
tb_name = tb_with_cols.keys.first
columns = tb_with_cols.values.first
columns.each { |c_name, c_type| add_columns << "\tadd_column(':#{tb_name}', :#{c_name}, :#{c_type})\n" }
add_columns
end
def migration_file_content(tb_with_cols)
cols = create_columns(tb_with_cols)
<<-RUBY
class AddMissingColumnsToTable < ActiveRecord::Migration
def change_table
#{cols}
end
end
RUBY
end
def write_content_to_file(path, content)
File.open(path, 'w+') do |f|
f.write(content)
end
end
Just call the method migration_file_content
in your code. Pass the parameter tb_with_cols
as a Hash, in which the key is the table_name
and value is the columns
that should be added to that table. Ex:
tb_with_cols = {:users => {:name => :string, :age => :integer, :address => :text} }
content = migration_file_content(tb_with_cols)
write_content_to_file("#{Rails.root}/db/migrations/', content)
After that call the method write_content_to_file
with your new migration file path and the content from our migration_file_content
method. 🙂