Sha256: 11b5b0260f6410f29567fb159f6ab759a27569a2fba24d4010666735e275ed96

Contents?: true

Size: 1.89 KB

Versions: 4

Compression:

Stored size: 1.89 KB

Contents

require 'rails_best_practices/checks/check'

module RailsBestPractices
  module Checks
    # Check db/schema.rb file to make sure every reference key has a database index.
    #
    # Implementation: read all add_index method calls to get the indexed columns in table, then read integer method call in create_table block to get the reference columns in tables, compare with indexed columns, if not in the indexed columns, then it violates always_add_db_index_check.
    class AlwaysAddDbIndexCheck < Check

      def interesting_nodes
        [:block, :call]
      end

      def interesting_files
        /db\/schema.rb/
      end

      def initialize
        super
        @index_columns = []
      end

      def evaluate_start(node)
        if :block == node.node_type
          find_index_columns(node)
        elsif :call == node.node_type
          case node.message
          when :create_table
            @table_name = node.arguments[1].to_ruby_string
          when :integer
            column_name = node.arguments[1].to_ruby_string
            if column_name =~ /_id$/ and !indexed?(@table_name, column_name)
              add_error "always add db index (#@table_name => #{column_name})", node.file, node.line
            end
          end
        end
      end
      
      private
        def find_index_columns(node)
          node.grep_nodes({:node_type => :call, :message => :add_index}).each do |index_node|
            table_name = index_node.arguments[1].to_ruby_string
            reference_column = eval(index_node.arguments[2].to_ruby)
            @index_columns << [table_name, reference_column]
          end
        end
        
        def indexed?(table_name, column_name)
          !!@index_columns.find do |reference|
            reference[0] == table_name and reference[1].class == String ? reference[1] == column_name : reference[1].include?(column_name)
          end
        end
    end
  end
end

Version data entries

4 entries across 4 versions & 1 rubygems

Version Path
rails_best_practices-0.4.2 lib/rails_best_practices/checks/always_add_db_index_check.rb
rails_best_practices-0.4.1 lib/rails_best_practices/checks/always_add_db_index_check.rb
rails_best_practices-0.4.0 lib/rails_best_practices/checks/always_add_db_index_check.rb
rails_best_practices-0.3.27 lib/rails_best_practices/checks/always_add_db_index_check.rb