class RuboCop::Cop::Rails::RedundantForeignKey

This cop detects cases where the `:foreign_key` option on associations is redundant.

@example

# bad
class Post
  has_many :comments, foreign_key: 'post_id'
end

class Comment
  belongs_to :post, foreign_key: 'post_id'
end

# good
class Post
  has_many :comments
end

class Comment
  belongs_to :author, foreign_key: 'user_id'
end

Constants

MSG
RESTRICT_ON_SEND

Public Instance Methods

on_send(node) click to toggle source
# File lib/rubocop/cop/rails/redundant_foreign_key.rb, line 40
def on_send(node)
  association_with_foreign_key(node) do |type, name, options, foreign_key_pair, foreign_key|
    if redundant?(node, type, name, options, foreign_key)
      add_offense(foreign_key_pair.loc.expression) do |corrector|
        range = range_with_surrounding_space(range: foreign_key_pair.source_range, side: :left)
        range = range_with_surrounding_comma(range, :left)

        corrector.remove(range)
      end
    end
  end
end

Private Instance Methods

default_foreign_key(node, association_type, association_name, options) click to toggle source
# File lib/rubocop/cop/rails/redundant_foreign_key.rb, line 59
def default_foreign_key(node, association_type, association_name, options)
  if association_type == :belongs_to
    "#{association_name}_id"
  elsif (as = find_as_option(options))
    "#{as}_id"
  else
    node.parent_module_name&.foreign_key
  end
end
find_as_option(options) click to toggle source
# File lib/rubocop/cop/rails/redundant_foreign_key.rb, line 69
def find_as_option(options)
  options.pairs.find do |pair|
    pair.key.sym_type? && pair.key.value == :as
  end&.value&.value
end
redundant?(node, association_type, association_name, options, foreign_key) click to toggle source
# File lib/rubocop/cop/rails/redundant_foreign_key.rb, line 55
def redundant?(node, association_type, association_name, options, foreign_key)
  foreign_key.to_s == default_foreign_key(node, association_type, association_name, options)
end