Skip to content

Commit 2f893da

Browse files
authored
Merge pull request #1253 from Earlopain/fix-error-for-rails-where-missing
Fix an error for `Rails/WhereMissing` without receiver
2 parents 96f469d + b05a7e0 commit 2f893da

File tree

3 files changed

+39
-1
lines changed

3 files changed

+39
-1
lines changed
Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1 @@
1+
* [#1253](https://github.com/rubocop/rubocop-rails/pull/1253): Fix an error for `Rails/WhereMissing` with leading `where` without receiver. ([@earlopain][])

lib/rubocop/cop/rails/where_missing.rb

Lines changed: 5 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -89,16 +89,20 @@ def replace_range(child)
8989
end
9090
end
9191

92+
# rubocop:disable Metrics/AbcSize
9293
def remove_where_method(corrector, node, where_node)
9394
range = range_between(where_node.loc.selector.begin_pos, where_node.loc.end.end_pos)
9495
if node.multiline? && !same_line?(node, where_node)
9596
range = range_by_whole_lines(range, include_final_newline: true)
96-
else
97+
elsif where_node.receiver
9798
corrector.remove(where_node.loc.dot)
99+
else
100+
corrector.remove(node.loc.dot)
98101
end
99102

100103
corrector.remove(range)
101104
end
105+
# rubocop:enable Metrics/AbcSize
102106

103107
def same_line?(left_joins_node, where_node)
104108
left_joins_node.loc.selector.line == where_node.loc.selector.line

spec/rubocop/cop/rails/where_missing_spec.rb

Lines changed: 33 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -24,6 +24,17 @@
2424
RUBY
2525
end
2626

27+
it 'registers an offense when using `left_joins(:foo).where(foo: {id: nil})` without receiver' do
28+
expect_offense(<<~RUBY)
29+
left_joins(:foo).where(foo: { id: nil }).where(bar: "bar")
30+
^^^^^^^^^^^^^^^^ Use `where.missing(:foo)` instead of `left_joins(:foo).where(foo: { id: nil })`.
31+
RUBY
32+
33+
expect_correction(<<~RUBY)
34+
where.missing(:foo).where(bar: "bar")
35+
RUBY
36+
end
37+
2738
it 'registers an offense when using `left_outer_joins(:foo).where(foos: {id: nil})`' do
2839
expect_offense(<<~RUBY)
2940
Foo.left_outer_joins(:foo).where(foos: { id: nil }).where(bar: "bar")
@@ -46,6 +57,17 @@
4657
RUBY
4758
end
4859

60+
it 'registers an offense when using `where(foos: {id: nil}).left_joins(:foo)` without receiver' do
61+
expect_offense(<<~RUBY)
62+
where(foos: { id: nil }).left_joins(:foo).where(bar: "bar")
63+
^^^^^^^^^^^^^^^^ Use `where.missing(:foo)` instead of `left_joins(:foo).where(foos: { id: nil })`.
64+
RUBY
65+
66+
expect_correction(<<~RUBY)
67+
where.missing(:foo).where(bar: "bar")
68+
RUBY
69+
end
70+
4971
it 'registers an offense when using `where(foos: {id: nil}, bar: "bar").left_joins(:foo)`' do
5072
expect_offense(<<~RUBY)
5173
Foo.where(foos: { id: nil }, bar: "bar").left_joins(:foo)
@@ -57,6 +79,17 @@
5779
RUBY
5880
end
5981

82+
it 'registers an offense when using `where(foos: {id: nil}, bar: "bar").left_joins(:foo)` without receiver' do
83+
expect_offense(<<~RUBY)
84+
where(foos: { id: nil }, bar: "bar").left_joins(:foo)
85+
^^^^^^^^^^^^^^^^ Use `where.missing(:foo)` instead of `left_joins(:foo).where(foos: { id: nil })`.
86+
RUBY
87+
88+
expect_correction(<<~RUBY)
89+
where(bar: "bar").where.missing(:foo)
90+
RUBY
91+
end
92+
6093
it "registers an offense when using `left_joins(:foo).where(foos: {id: nil}, bar: 'bar')`" do
6194
expect_offense(<<~RUBY)
6295
Foo.left_joins(:foo).where(foos: { id: nil }, bar: "bar")

0 commit comments

Comments
 (0)