diff --git a/CHANGELOG.md b/CHANGELOG.md index e2a0f75f46..6fb0e7c51d 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -5,6 +5,7 @@ ### Bug fixes * [#515](https://github.com/rubocop/rubocop-rails/issues/515): Fix an error for `Rails/BulkChangeTable` when using Psych 4.0. ([@koic][]) +* [#512](https://github.com/rubocop/rubocop-rails/issues/512): Fix a false positive for `Rails/FindBy` when using `take` with arguments. ([@koic][]) ## 2.11.1 (2021-06-25) diff --git a/lib/rubocop/cop/rails/find_by.rb b/lib/rubocop/cop/rails/find_by.rb index 69d5925211..02beb5aba3 100644 --- a/lib/rubocop/cop/rails/find_by.rb +++ b/lib/rubocop/cop/rails/find_by.rb @@ -32,10 +32,10 @@ class FindBy < Base RESTRICT_ON_SEND = %i[first take].freeze def on_send(node) - return unless where_method?(node.receiver) + return unless node.arguments.empty? && where_method?(node.receiver) return if ignore_where_first? && node.method?(:first) - range = range_between(node.receiver.loc.selector.begin_pos, node.loc.selector.end_pos) + range = offense_range(node) add_offense(range, message: format(MSG, method: node.method_name)) do |corrector| autocorrect(corrector, node) @@ -51,6 +51,10 @@ def where_method?(receiver) receiver.respond_to?(:method?) && receiver.method?(:where) end + def offense_range(node) + range_between(node.receiver.loc.selector.begin_pos, node.loc.selector.end_pos) + end + def autocorrect(corrector, node) return if node.method?(:first) diff --git a/spec/rubocop/cop/rails/find_by_spec.rb b/spec/rubocop/cop/rails/find_by_spec.rb index 0a4ef8890e..3b8b337d9a 100644 --- a/spec/rubocop/cop/rails/find_by_spec.rb +++ b/spec/rubocop/cop/rails/find_by_spec.rb @@ -35,6 +35,12 @@ RUBY end + it 'does not register an offense when using `take` with arguments' do + expect_no_offenses(<<~RUBY) + User.where(attr: arg).take(5) + RUBY + end + it 'does not register an offense when calling `take` after block' do expect_no_offenses(<<~RUBY) do_something {}.take(5) @@ -72,6 +78,12 @@ expect_no_corrections end + + it 'does not register an offense when using `first` with arguments' do + expect_no_offenses(<<~RUBY) + User.where(attr: arg).first(5) + RUBY + end end context 'when receiver is not an Active Record' do