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