class StatsStorePolymorphicAssociation < ActiveRecord::Migration[5.2] def change return if !Setting.exists?(name: 'system_init_done') # create ObjectLookup ID -> Model map object_lookup_map = ObjectLookup.all.pluck(:id, :name) # create empty, indexed polymorphic association columns add_reference :stats_stores, :stats_storable, polymorphic: true, index: true # migrate column data in the most performance way object_lookup_map.each do |id, model| StatsStore.where(stats_store_object_id: id) .update_all("stats_storable_id = o_id, stats_storable_type = '#{model}'") # rubocop:disable Rails/SkipsModelValidations end # rubocop:disable Rails/ReversibleMigration # remove home made "polymorphic association" columns remove_column :stats_stores, :o_id remove_column :stats_stores, :stats_store_object_id # remove unused/obsolete columns remove_column :stats_stores, :related_stats_store_object_id remove_column(:stats_stores, :related_o_id) if StatsStore.column_names.include?('related_o_id') # rubocop:enable Rails/ReversibleMigration end end