Class: RuboCop::Cop::Sequioacap::ClassName

Inherits:
RuboCop::Cop show all
Defined in:
lib/rubocop/cop/sequioacap/class_name.rb

Overview

Cop to prevent cross-model references, which result in a cascade of autoloads. E.g., belongs_to :user, :class_name => User.name

Constant Summary collapse

MSG =
'Use "Model" instead of Model.name at class scope to avoid cross-model references. ' \
'They cause a long cascade of autoloading, slowing down app startup and slowing down ' \
'reloading of zeus after changing a model.'.freeze

Instance Method Summary collapse

Instance Method Details

#on_send(node) ⇒ Object

Is this a has_many, has_one, or belongs_to with a :class_name arg? Make sure the class name is a hardcoded string. If not, add an offense and return true.



17
18
19
20
21
22
23
24
25
26
27
28
29
30
# File 'lib/rubocop/cop/sequioacap/class_name.rb', line 17

def on_send(node)
  association_statement =
    node.command?(:has_many) ||
    node.command?(:has_one) ||
    node.command?(:belongs_to)

  return unless association_statement

  class_pair = class_name_node(node)

  if class_pair && !string_class_name?(class_pair)
    add_offense(class_pair)
  end
end