class RuboCop::Cop::Rails::FindById


User.find(id)
# good
User.find_by!(id: id)
User.find_by_id!(id)
User.where(id: id).take!
# bad
@example
by primary key when you expect it to be found.
‘where.take!`, `find_by!`, and `find_by_id!` to retrieve a single record
Enforces that `ActiveRecord#find` is used instead of

def build_good_method(id_value)

def build_good_method(id_value)
  "find(#{id_value.source})"
end

def find_by_offense_range(node)

def find_by_offense_range(node)
  range_between(node.loc.selector.begin_pos, node.source_range.end_pos)
end

def on_send(node)

def on_send(node)
  where_take?(node) do |where, id_value|
    range = where_take_offense_range(node, where)
    register_offense(range, id_value)
  end
  find_by?(node) do |id_value|
    range = find_by_offense_range(node)
    register_offense(range, id_value)
  end
end

def register_offense(range, id_value)

def register_offense(range, id_value)
  good_method = build_good_method(id_value)
  message = format(MSG, good_method: good_method, bad_method: range.source)
  add_offense(range, message: message) do |corrector|
    corrector.replace(range, good_method)
  end
end

def where_take_offense_range(node, where)

def where_take_offense_range(node, where)
  range_between(where.loc.selector.begin_pos, node.source_range.end_pos)
end