class MappingPolymorphism < ActiveRecord::Migration def up add_column :mappings, :mappable_id, :integer add_column :mappings, :mappable_type, :string add_index :mappings, [:mappable_id, :mappable_type] Mapping.find_each do |mapping| if mapping.synapse_id.nil? && mapping.topic_id.nil? puts "Mapping id=#{mapping.id} has no valid id, skipping!" next end if !mapping.synapse_id.nil? && !mapping.topic_id.nil? puts "Mapping id=#{mapping.id} has both topic and synapse ids, skipping!" next end if mapping.synapse_id.nil? mapping.mappable = Topic.find_by(id: mapping.topic_id) else mapping.mappable = Synapse.find_by(id: mapping.synapse_id) end if mapping.mappable.nil? mapping.delete else mapping.save end end end def down remove_index :mappings, [:mappable_id, :mappable_type] remove_column :mappings, :mappable_id, :integer remove_column :mappings, :mappable_type, :string end end