RubyOnRails 3, mettre des index sur les clés primaires et étrangères dans une migration

Personne n'ignore que poser des index sur les clés primaires et étrangères augmente les performances des requêtes du sgbd.

https://fr.wikipedia.org/wiki/Index_(base_de_donn%C3%A9es)

Voici une migration magique. Elle ne gère pas les clés étrangères sur les tables de jointure (je n'ai pas pris le temps de le faire, mais si vous le faites postez-moi un commentaire)

class AddIndexes < ActiveRecord::Migration

  def self.up

    c = ActiveRecord::Base.connection

    ts = c.tables

    ts = ts - ["schema_migrations"]

    ts.each do |t|

      begin

        tablefields = eval(t.camelize.singularize + '.column_names')

      

        for ff in tablefields

          if ff == 'id' or not (ff =~ /.*_id/).nil? then

            add_index t, ff, :name => "index_#{t}_on_#{ff}"

          end

        end

      rescue

        puts "Erreur sur les tables de jointure"

      end

    end

  end


  def self.down

    c = ActiveRecord::Base.connection

    ts = c.tables

    ts = ts - ["schema_migrations"]

    ts.each do |t|

      begin

        tablefields = eval(t.camelize.singularize + '.column_names')


        for ff in tablefields

          if ff == 'id' or not (ff =~ /.*_id/).nil? then

            remove_index t, :name => "index_#{t}_on_#{ff}"

          end

        end

      rescue

        puts "Erreur sur les tables de jointure"

      end

    end

  end

end