diff --git a/changelog/fix_false_positive_database_qualified.md b/changelog/fix_false_positive_database_qualified.md new file mode 100644 index 0000000000..50e815b818 --- /dev/null +++ b/changelog/fix_false_positive_database_qualified.md @@ -0,0 +1 @@ +* [#1340](https://github.com/rubocop/rubocop-rails/issues/1340): Fix a false positive for `Rails/WhereEquals`, `Rails/WhereNot`, and `Rails/WhereRange` when qualifying the database name. ([@earlopain][]) diff --git a/lib/rubocop/cop/rails/where_equals.rb b/lib/rubocop/cop/rails/where_equals.rb index b1d56b7c24..b538bedd8d 100644 --- a/lib/rubocop/cop/rails/where_equals.rb +++ b/lib/rubocop/cop/rails/where_equals.rb @@ -74,6 +74,7 @@ def offense_range(node) range_between(node.loc.selector.begin_pos, node.source_range.end_pos) end + # rubocop:disable Metrics/AbcSize, Metrics/CyclomaticComplexity, Metrics/MethodLength def extract_column_and_value(template_node, value_node) value = case template_node.value @@ -90,8 +91,12 @@ def extract_column_and_value(template_node, value_node) return end - [Regexp.last_match(1), value] + column_qualifier = Regexp.last_match(1) + return if column_qualifier.count('.') > 1 + + [column_qualifier, value] end + # rubocop:enable Metrics/AbcSize, Metrics/CyclomaticComplexity, Metrics/MethodLength def build_good_method(method_name, column, value) if column.include?('.') diff --git a/lib/rubocop/cop/rails/where_not.rb b/lib/rubocop/cop/rails/where_not.rb index 96762f5e47..2b6300165e 100644 --- a/lib/rubocop/cop/rails/where_not.rb +++ b/lib/rubocop/cop/rails/where_not.rb @@ -68,6 +68,7 @@ def offense_range(node) range_between(node.loc.selector.begin_pos, node.source_range.end_pos) end + # rubocop:disable Metrics/AbcSize, Metrics/CyclomaticComplexity, Metrics/MethodLength def extract_column_and_value(template_node, value_node) value = case template_node.value @@ -84,8 +85,12 @@ def extract_column_and_value(template_node, value_node) return end - [Regexp.last_match(1), value] + column_qualifier = Regexp.last_match(1) + return if column_qualifier.count('.') > 1 + + [column_qualifier, value] end + # rubocop:enable Metrics/AbcSize, Metrics/CyclomaticComplexity, Metrics/MethodLength def build_good_method(dot, column, value) dot ||= '.' diff --git a/lib/rubocop/cop/rails/where_range.rb b/lib/rubocop/cop/rails/where_range.rb index 4797a50e81..1c8fd4a0fb 100644 --- a/lib/rubocop/cop/rails/where_range.rb +++ b/lib/rubocop/cop/rails/where_range.rb @@ -140,6 +140,8 @@ def extract_column_and_value(template_node, values_node) rhs = pair2.value end end + else + return end if lhs @@ -150,7 +152,10 @@ def extract_column_and_value(template_node, values_node) rhs_source = parentheses_needed?(rhs) ? "(#{rhs.source})" : rhs.source end - [Regexp.last_match(1), "#{lhs_source}#{operator}#{rhs_source}"] if operator + column_qualifier = Regexp.last_match(1) + return if column_qualifier.count('.') > 1 + + [column_qualifier, "#{lhs_source}#{operator}#{rhs_source}"] if operator end # rubocop:enable Metrics diff --git a/spec/rubocop/cop/rails/where_equals_spec.rb b/spec/rubocop/cop/rails/where_equals_spec.rb index 1af170ebff..5c564a72e7 100644 --- a/spec/rubocop/cop/rails/where_equals_spec.rb +++ b/spec/rubocop/cop/rails/where_equals_spec.rb @@ -217,4 +217,10 @@ users.not('name = ?', 'Gabe') RUBY end + + it 'does not register an offense when qualifying the database' do + expect_no_offenses(<<~RUBY) + User.where('database.users.name = ?', 'Gabe') + RUBY + end end diff --git a/spec/rubocop/cop/rails/where_not_spec.rb b/spec/rubocop/cop/rails/where_not_spec.rb index 84d8aeded0..36e1ecca54 100644 --- a/spec/rubocop/cop/rails/where_not_spec.rb +++ b/spec/rubocop/cop/rails/where_not_spec.rb @@ -275,4 +275,10 @@ User.where('name <> ? AND age <> ?', 'john', 19) RUBY end + + it 'does not register an offense when qualifying the database' do + expect_no_offenses(<<~RUBY) + User.where('database.users.name != ?', 'Gabe') + RUBY + end end diff --git a/spec/rubocop/cop/rails/where_range_spec.rb b/spec/rubocop/cop/rails/where_range_spec.rb index 6a5a7b3353..4102fee308 100644 --- a/spec/rubocop/cop/rails/where_range_spec.rb +++ b/spec/rubocop/cop/rails/where_range_spec.rb @@ -221,6 +221,12 @@ Model.where(column: ...value) RUBY end + + it 'does not register an offense when qualifying the database' do + expect_no_offenses(<<~RUBY) + Model.where('database.table.column >= ?', value) + RUBY + end end end end