# run from the root: ruby find_missing_indices.rb require File.expand_path("../config/environment", __FILE__) Rails.application.eager_load! models = ActiveRecord::Base.descendants conn = ActiveRecord::Base.connection missing_index = [] models.each do |model| uniqueness_validators = model.validators.select {|v| v.class == ActiveRecord::Validations::UniquenessValidator } uniqueness_validators.each do |validation| attrs = validation.attributes.dup attrs.concat Array(validation.options[:scope]) if validation.options.key? :scope attrs = attrs.map(&:to_s).map { |attr| model.column_names.include?(attr) ? attr : "#{attr}_id" }.sort unique_indices = conn.indexes(model.table_name).select { |idx| idx.unique } unless unique_indices.any? { |idx| idx.columns.sort == attrs } missing_index << [model, validation] end end end puts "=== Missing indices ===" missing_index.each do |(model, validation)| msg = "#{model}: validates #{validation.attributes}" msg << " (scope: #{validation.options[:scope]})" if validation.options.key? :scope puts msg end