module ClassMethods
Public Instance Methods
auto_add_index(method, *args, &block)
click to toggle source
# File lib/data_plan/generators/migration/lib/auto_migrations.rb, line 176 def auto_add_index(method, *args, &block) table_name = args.shift.to_s fields = Array(args.shift).map(&:to_s) options = args.shift index_name = options[:name] if options index_name ||= "index_#{table_name}_on_#{fields.join('_and_')}" (self.indexes_in_schema ||= []) << index_name unless ActiveRecord::Base.connection.indexes(table_name).detect { |i| i.name == index_name } method_missing_without_auto_migration(method, *[table_name, fields, options], &block) end end
auto_create_table(method, *args) { |table_definition| ... }
click to toggle source
# File lib/data_plan/generators/migration/lib/auto_migrations.rb, line 63 def auto_create_table(method, *args, &block) table_name = args.shift.to_s options = args.pop || {} (self.tables_in_schema ||= []) << table_name # Table doesn't exist, create it unless ActiveRecord::Base.connection.tables.include?(table_name) return method_missing_without_auto_migration(method, *[table_name, options], &block) end # Grab database columns fields_in_db = ActiveRecord::Base.connection.columns(table_name).inject({}) do |hash, column| hash[column.name] = column hash end # Grab schema columns (lifted from active_record/connection_adapters/abstract/schema_statements.rb) table_definition = ActiveRecord::ConnectionAdapters::TableDefinition.new(ActiveRecord::Base.connection) table_definition.primary_key(options[:primary_key] || "id") unless options[:id] == false yield table_definition fields_in_schema = table_definition.columns.inject({}) do |hash, column| hash[column.name.to_s] = column hash end # Add fields to db new to schema (fields_in_schema.keys - fields_in_db.keys).each do |field| column = fields_in_schema[field] add_column table_name, column.name, column.type.to_sym, :limit => column.limit, :precision => column.precision, :scale => column.scale, :default => column.default, :null => column.null end # Remove fields from db no longer in schema (fields_in_db.keys - fields_in_schema.keys & fields_in_db.keys).each do |field| column = fields_in_db[field] remove_column table_name, column.name end # Change field type if schema is different from db (fields_in_schema.keys & fields_in_db.keys).each do |field| # TYPE if (field != 'id') && (fields_in_schema[field].type.to_sym != fields_in_db[field].type.to_sym) change_column table_name, fields_in_schema[field].name.to_sym, fields_in_schema[field].type.to_sym end # DEFAULT VALUE if (field != 'id') && (fields_in_schema[field].default != fields_in_db[field].default) change_column_default table_name, fields_in_schema[field].name.to_sym, fields_in_schema[field].default end end end
auto_create_view(method, *args) { |view_definition| ... }
click to toggle source
# File lib/data_plan/generators/migration/lib/auto_migrations.rb, line 115 def auto_create_view(method, *args, &block) # we are working on it with Cyril Boswell return true # so when we'll find an idea, we'll remove this return true. view_name = args.shift.to_s select_query = args.pop options = args.pop || {} (self.views_in_schema ||= []) << view_name # View doesn't exist, create it unless ActiveRecord::Base.connection.views.include?(view_name) return method_missing_without_auto_migration(method, *[view_name, options], &block) end # Grab database view select db_select = ActiveRecord::Base.connection.view_select_statement( view_name ) # Grab database columns fields_in_db = ActiveRecord::Base.connection.columns(view_name).inject({}) do |hash, column| hash[column.name] = column hash end # Grab schema columns (lifted from active_record/connection_adapters/abstract/schema_statements.rb) view_definition = RailsSqlViews::ConnectionAdapters::ViewDefinition.new(ActiveRecord::Base.connection,select_query) yield view_definition fields_in_schema = view_definition.columns.inject({}) do |hash, column| hash[column.to_s] = column hash end not_same = false # Add fields to db new to schema (fields_in_schema.keys - fields_in_db.keys).each do |field| not_same = true # column = fields_in_schema[field] # add_column view_name, column end # Remove fields from db no longer in schema (fields_in_db.keys - fields_in_schema.keys & fields_in_db.keys).each do |field| not_same = true # column = fields_in_db[field] # remove_column view_name, column.name end puts "DB_SELECT="+db_select puts "QUERY="+select_query puts "NOT SAME="+not_same.to_s if not_same or (db_select != select_query) drop_view view_name return method_missing_without_auto_migration(method, *[view_name, options], &block) end end
drop_unused_indexes()
click to toggle source
# File lib/data_plan/generators/migration/lib/auto_migrations.rb, line 205 def drop_unused_indexes tables_in_schema.each do |table_name| indexes_in_db = ActiveRecord::Base.connection.indexes(table_name).map(&:name) rescue next (indexes_in_db - indexes_in_schema & indexes_in_db).each do |index_name| remove_index table_name, :name => index_name end end end
drop_unused_tables()
click to toggle source
# File lib/data_plan/generators/migration/lib/auto_migrations.rb, line 191 def drop_unused_tables (ActiveRecord::Base.connection.tables - tables_in_schema - ["schema_info"]).each do |table| drop_table table if table != "schema_migrations" end end
drop_unused_views()
click to toggle source
# File lib/data_plan/generators/migration/lib/auto_migrations.rb, line 197 def drop_unused_views # temporary return true (ActiveRecord::Base.connection.views - views_in_schema - ["schema_info"]).each do |view| drop_view view end end
method_missing_with_auto_migration(method, *args, &block)
click to toggle source
# File lib/data_plan/generators/migration/lib/auto_migrations.rb, line 50 def method_missing_with_auto_migration(method, *args, &block) case method when :create_table auto_create_table(method, *args, &block) when :create_view auto_create_view(method, *args, &block) when :add_index auto_add_index(method, *args, &block) else method_missing_without_auto_migration(method, *args, &block) end end