Skip to content

Instantly share code, notes, and snippets.

@scarfacedeb
Created May 13, 2015 14:44
Show Gist options
  • Select an option

  • Save scarfacedeb/bdf4e7b25c143cd87de7 to your computer and use it in GitHub Desktop.

Select an option

Save scarfacedeb/bdf4e7b25c143cd87de7 to your computer and use it in GitHub Desktop.

Revisions

  1. Andrew Volozhanin created this gist May 13, 2015.
    30 changes: 30 additions & 0 deletions find_missing_indices.rb
    Original file line number Diff line number Diff line change
    @@ -0,0 +1,30 @@
    # 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