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