class RuboCop::Cop::Rails::Pick

This cop enforces the use of `pick` over `pluck(…).first`.

Using `pluck` followed by `first` creates an intermediate array, which `pick` avoids. When called on an Active Record relation, `pick` adds a limit to the query so that only one value is fetched from the database.

@example

# bad
Model.pluck(:a).first
[{ a: :b, c: :d }].pluck(:a, :b).first

# good
Model.pick(:a)
[{ a: :b, c: :d }].pick(:a, :b)

Constants

MSG
RESTRICT_ON_SEND

Public Instance Methods

on_send(node) click to toggle source
# File lib/rubocop/cop/rails/pick.rb, line 33
def on_send(node)
  pick_candidate?(node) do
    receiver = node.receiver
    receiver_selector = receiver.loc.selector
    node_selector = node.loc.selector
    range = receiver_selector.join(node_selector)

    add_offense(range, message: message(receiver)) do |corrector|
      first_range = receiver.source_range.end.join(node_selector)

      corrector.remove(first_range)
      corrector.replace(receiver_selector, 'pick')
    end
  end
end

Private Instance Methods

message(receiver) click to toggle source
# File lib/rubocop/cop/rails/pick.rb, line 51
def message(receiver)
  format(MSG, args: receiver.arguments.map(&:source).join(', '))
end