How to create a migration file dynamically by meta programming in rails 4.0

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" }


 def migration_file_content(tb_with_cols)
   cols = create_columns(tb_with_cols)
  class AddMissingColumnsToTable < ActiveRecord::Migration
     def change_table

 def write_content_to_file(path, content), 'w+') do |f|

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. 🙂

How to find a column type if table name and column name is given in Rails ActiveRecord

I found difficulty to find this. If we have table name and column name we can find this from ActiveRecord::Base.connection ‘column_for’ method.

Use the column_for method for finding the column type

ActiveRecord::Base.connection.column_for("table_name",  "column_name").type