<% def version config = YAML.load(File.read(File.join(EVENTABLE_ROOT, 'VERSION.yml'))) "#{config[:major]}.#{config[:minor]}.#{config[:patch]}" end -%> class <%= "SetupEventable#{version.gsub('.','')}" -%> < ActiveRecord::Migration <% tables = { :eventable_program_items => [ [:event_id, 't.belongs_to :event'], [:user_id, 't.belongs_to :user'], [:start_at, 't.datetime :start_at'], [:end_at, 't.datetime :end_at'] ], :eventable_reviews => [ [:program_item_id, 't.belongs_to :program_item'], [:review, 't.float :review'], [:text, 't.text :text'] ], :eventable_prices => [ [:event_id, 't.belongs_to :event'], [:text, 't.text :text'], [:price, 't.decimal :price, :scale => 2, :precision => 6'] ], :eventable_opening_periods => [ [:event_id, 't.belongs_to :event'], [:start_at, 't.datetime :start_at'], [:end_at, 't.datetime :end_at'] ], :eventable_opening_times => [ [:period_id, 't.belongs_to :period'], [:day_of_week, 't.integer :day_of_week'], [:minutes_start, 't.integer :minutes_start'], [:minutes_end, 't.integer :minutes_end'], ], :eventable_categories => [ [:name, 't.string :name'], [:description, 't.text :description'], [:group, 't.string :group'], [:avatar_file_name, 't.string :avatar_file_name'], [:avatar_file_size, 't.integer :avatar_file_size'], [:avatar_content_type, 't.string :avatar_content_type'] ], :eventable_categories_events => [ [:event_id, 't.belongs_to :event'], [:category_id, 't.belongs_to :category'] ] } indexes = { :eventable_program_items => [ :event_id, :user_id ], :eventable_reviews => [ :program_item_id ], :eventable_prices => [ :event_id ], :eventable_opening_periods => [ :event_id, [:start_at, :end_at] ], :eventable_opening_times => [ { :index => [:period_id, :day_of_week, :minutes_start, :minutes_end], :name => 'full_index' } ], :eventable_categories_events => [ :event_id, :category_id ], } -%> def self.up <% tables.keys.each do |table| -%> <% cols = tables[table] -%> <% if ActiveRecord::Base.connection.table_exists?(table) -%> change_table(:<%= table -%>) do |t| <% existing_columns = ActiveRecord::Base.connection.columns(table).map(&:name) -%> <% cols.reject! { |c| existing_columns.include?(c.first.to_s) } -%> <% else -%> create_table(:<%= table -%>) do |t| <% end -%> <% cols.each do |c| -%> <%= c.last %> <% end -%> end <% end -%> <% indexes.keys.each do |table| -%> <% idxs = indexes[table] -%> <% if ActiveRecord::Base.connection.table_exists?(table) -%> <% existing_indexes = ActiveRecord::Base.connection.indexes(table).map{|c| c.columns.sort} -%> <% idxs.reject! { |c| existing_indexes.include?([*c].map(&:to_s).sort) } -%> <% end -%> <% idxs.each do |i| -%> <% if Hash === i -%> add_index :<%= table %>, <%= i[:index].inspect %>, :name => <%= i[:name].inspect -%> <% else -%> add_index :<%= table %>, <%= i.inspect %> <% end -%> <% end -%> <% end -%> end def self.down <% indexes.keys.each do |table| -%> <% idxs = indexes[table] -%> <% idxs.each do |i| -%> <% if Hash === i -%> remove_index :<%= table %>, <%= i[:index].inspect %>, :name => <%= i[:name].inspect -%> <% else -%> remove_index :<%= table %>, <%= i.inspect %> <% end -%> <% end -%> <% end -%> <% tables.keys.each do |table| -%> <% cols = tables[table] -%> <% if ActiveRecord::Base.connection.table_exists?(table) -%> change_table(:<%= table -%>) do |t| <% cols.each do |c| -%> t.remove :<%= c.first %> <% end -%> end <% else -%> drop_table :<%= table -%> <% end -%> <% end -%> end end