Skip to content

Commit c7e7de3

Browse files
committed
Support conditions specific to the validator
validates can take a hash of options specific to one validator
1 parent 2775559 commit c7e7de3

File tree

2 files changed

+29
-12
lines changed

2 files changed

+29
-12
lines changed

lib/rubocop/cop/rails/unique_validation_without_index.rb

Lines changed: 9 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -139,6 +139,15 @@ def condition_part?(node)
139139
pairs = node.arguments.last
140140
return unless pairs.hash_type?
141141

142+
return true if condition_hash_part?(pairs)
143+
144+
uniqueness_node = uniqueness_part(node)
145+
return unless uniqueness_node&.hash_type?
146+
147+
condition_hash_part?(uniqueness_node)
148+
end
149+
150+
def condition_hash_part?(pairs)
142151
pairs.each_pair.any? do |pair|
143152
key = pair.key
144153
next unless key.sym_type?

spec/rubocop/cop/rails/unique_validation_without_index_spec.rb

Lines changed: 20 additions & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -327,7 +327,7 @@ class Article
327327
end
328328
end
329329

330-
context 'with an if condition on the validation' do
330+
context 'without the proper index' do
331331
let(:schema) { <<~RUBY }
332332
ActiveRecord::Schema.define(version: 2020_02_02_075409) do
333333
create_table "articles", force: :cascade do |t|
@@ -336,30 +336,38 @@ class Article
336336
end
337337
RUBY
338338

339-
it 'does not register an offense' do
339+
it 'does not register an offense with an if condition on validates' do
340340
expect_no_offenses(<<~RUBY)
341341
class Article
342342
belongs_to :user
343343
validates :user, uniqueness: true, if: -> { false }
344344
end
345345
RUBY
346346
end
347-
end
348347

349-
context 'with an unless condition on the validation' do
350-
let(:schema) { <<~RUBY }
351-
ActiveRecord::Schema.define(version: 2020_02_02_075409) do
352-
create_table "articles", force: :cascade do |t|
353-
t.bigint "user_id", null: false
348+
it 'does not register an offense with an unless condition on validates' do
349+
expect_no_offenses(<<~RUBY)
350+
class Article
351+
belongs_to :user
352+
validates :user, uniqueness: true, unless: -> { true }
354353
end
355-
end
356-
RUBY
354+
RUBY
355+
end
357356

358-
it 'does not register an offense' do
357+
it 'does not register an offense with an if condition on the specific validator' do
359358
expect_no_offenses(<<~RUBY)
360359
class Article
361360
belongs_to :user
362-
validates :user, uniqueness: true, unless: -> { true }
361+
validates :user, uniqueness: { if: -> { false } }
362+
end
363+
RUBY
364+
end
365+
366+
it 'does not register an offense with an unless condition on the specific validator' do
367+
expect_no_offenses(<<~RUBY)
368+
class Article
369+
belongs_to :user
370+
validates :user, uniqueness: { unless: -> { false } }
363371
end
364372
RUBY
365373
end

0 commit comments

Comments
 (0)