class RuboCop::Cop::Rails::ActiveRecordOverride
end
end
self.title = title.upcase!
def upcase_title
before_save :upcase_title
class Book < ApplicationRecord
# good
end
end
super
self.title = title.upcase!
def save
class Book < ApplicationRecord
# bad
@example
callbacks.
Checks for overriding built-in Active Record methods instead of using
def active_model?(parent_class_name)
def active_model?(parent_class_name) ACTIVE_RECORD_CLASSES.include?(parent_class_name) end
def callback_names(method_name)
def callback_names(method_name) names = %w[before_ around_ after_].map do |prefix| "`#{prefix}#{method_name}`" end names[-1] = "or #{names.last}" names.join(', ') end
def find_parent_class_name(node)
def find_parent_class_name(node) return nil unless node if node.class_type? parent_class_name = node.node_parts[1] return nil if parent_class_name.nil? return parent_class_name.source end find_parent_class_name(node.parent) end
def message(method_name)
def message(method_name) format(MSG, prefer: callback_names(method_name), bad: method_name) end
def on_def(node)
def on_def(node) return unless BAD_METHODS.include?(node.method_name) parent_class_name = find_parent_class_name(node) return unless active_model?(parent_class_name) return unless node.descendants.any?(&:zsuper_type?) add_offense(node, message: message(node.method_name)) end