class RuboCop::Cop::Rails::UniqBeforePluck
Model.uniq.pluck(:id)
# good
Model.pluck(:id).uniq
# bad
instance.assoc.pluck(:id).uniq
# an association on an instance will return a CollectionProxy
# bad
Model.where(cond: true).pluck(:id).uniq
# this will return a Relation that pluck is called on
# bad
@example EnforcedStyle: aggressive
Model.uniq.pluck(:id)
# good
Model.pluck(:id).uniq
# bad
@example EnforcedStyle: conservative (default)
false positives.
Autocorrect is disabled by default for this cop since it may generate
vs a call to pluck on an ActiveRecord::Associations::CollectionProxy.
cannot distinguish between calls to pluck on an ActiveRecord::Relation
uniq are added as offenses. This may lead to false positives as the cop
When the EnforcedStyle is aggressive then all calls to pluck before
(i.e. a model class) before uniq are added as offenses.
is conservative (the default) then only calls to pluck on a constant
This cop has two different enforcement modes. When the EnforcedStyle
the database.
The use of uniq before pluck is preferred because it executes within
Prefer the use of uniq (or distinct), before pluck instead of after.
def autocorrect(node)
def autocorrect(node) lambda do |corrector| method = node.method_name corrector.remove(dot_method_with_whitespace(method, node)) corrector.insert_before(node.receiver.loc.dot.begin, ".#{method}") end end
def dot_method_begin_pos(method, node)
def dot_method_begin_pos(method, node) lines = node.source.split(NEWLINE) if lines.last.strip == ".#{method}" node.source.rindex(NEWLINE) else node.loc.dot.begin_pos end end
def dot_method_with_whitespace(method, node)
def dot_method_with_whitespace(method, node) range_between(dot_method_begin_pos(method, node), node.loc.selector.end_pos) end
def on_send(node)
def on_send(node) method = if style == :conservative conservative_node_match(node) else aggressive_node_match(node) end return unless method add_offense(node, location: :selector, message: format(MSG, method: method)) end
def style_parameter_name
def style_parameter_name 'EnforcedStyle' end