Sha256: 4e2a367d32ebb339e2577c8cb6de0318d31f1b7566e3e9edfc8a34f67d0c5efc

Contents?: true

Size: 1.86 KB

Versions: 11

Compression:

Stored size: 1.86 KB

Contents

class MigrationEmitter
  attr_accessor :table_name
  attr_accessor :columns
  attr_accessor :options

  def initialize(table_name, initial = [], options={})
    self.table_name = table_name
    self.columns = initial
    self.options = options
  end

  def self.join_table(*classes)
    a = self.new classes.map_to(:to_s).map_to(:tableize).sort.join('_').to_sym
    (0..1).each {|i|
      a.column classes[i].foreign_key, :integer, :index=>:true
    }
    a.options[:id] = false
    a
  end

  def self.entity(class_name, *initial)
    return self.new(class_name.to_s.tableize.to_sym, initial)
  end

  def column(name, datatype, options={})
    self.columns << {:name=>name, :datatype=>datatype, :options=>options}
  end

  def create_table
    return "
    create_table #{create_table_def} do |t|
      #{columns.map{|c| coldef(c)}.join("\n    ")}
      t.timestamps
    end
    " + create_indexes
  end

  def drop_table
    "drop_table #{table_name.inspect}"
  end

  def add_columns
    columns.map{|c|
      "add_column " +
        [table_name.inspect, c[:name].inspect, c[:datatype].inspect,
          map_inspect(c[:options].except(:index))
        ].flatten.join(', ')
    }.join("\n    ") + "\n    " + create_indexes
  end

  def remove_columns
    columns.map{|c| "remove_column #{table_name.inspect}, #{c[:name].inspect}"}.join("\n    ")
  end


  private

  def create_indexes
    columns.select{|t| t[:options][:index] }.map{|t|
      "add_index :#{table_name}, :#{t[:name]}" + (t[:options][:index]==:unique ? ", :unique=>true" : "")
    }.join('\n    ')
  end

  def coldef(col)
    ["t.#{col[:datatype]} :#{col[:name]}",
      map_inspect(col[:options].except(:index))].
      flatten.join(', ')
  end

  def create_table_def
    [table_name.inspect, map_inspect(options)].
      flatten.join(", ")
  end

  def map_inspect(map)
    map.map{|a,b| "#{a.inspect} => #{b.inspect}"}
  end
end

Version data entries

11 entries across 11 versions & 1 rubygems

Version Path
casey_jones-0.1.2 lib/generators/extra_user_attributes/migration_emitter.rb
casey_jones-0.1.1 lib/generators/extra_user_attributes/migration_emitter.rb
casey_jones-0.1.0 lib/generators/extra_user_attributes/migration_emitter.rb
casey_jones-0.0.121 lib/generators/extra_user_attributes/migration_emitter.rb
casey_jones-0.0.120 lib/generators/extra_user_attributes/migration_emitter.rb
casey_jones-0.0.119 lib/generators/extra_user_attributes/migration_emitter.rb
casey_jones-0.0.118 lib/generators/extra_user_attributes/migration_emitter.rb
casey_jones-0.0.117 lib/generators/extra_user_attributes/migration_emitter.rb
casey_jones-0.0.116 lib/generators/extra_user_attributes/migration_emitter.rb
casey_jones-0.0.115 lib/generators/extra_user_attributes/migration_emitter.rb
casey_jones-0.0.114 lib/generators/extra_user_attributes/migration_emitter.rb