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