Module: AutoMigrations::ClassMethods

Defined in:
lib/data_plan/generators/migration/lib/auto_migrations.rb

Instance Method Summary collapse

Instance Method Details

#auto_add_index(method, *args, &block) ⇒ Object



176
177
178
179
180
181
182
183
184
185
186
187
188
189
# 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| ... } ⇒ Object

Yields:

  • (table_definition)


63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
# 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| ... } ⇒ Object

Yields:

  • (view_definition)


115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
# 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_indexesObject



205
206
207
208
209
210
211
212
# 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_tablesObject



191
192
193
194
195
# 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_viewsObject



197
198
199
200
201
202
203
# 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) ⇒ Object



50
51
52
53
54
55
56
57
58
59
60
61
# 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