Skip to content

Commit 19ab2b8

Browse files
authored
Merge pull request rails#52972 from bogdan/optimize-class-lookup-in-uniqueness-validation
Optimize AR uniqueness validator class hierarchy lookup
2 parents ae3feb7 + 3584c09 commit 19ab2b8

File tree

1 file changed

+8
-8
lines changed

1 file changed

+8
-8
lines changed

activerecord/lib/active_record/validations/uniqueness.rb

Lines changed: 8 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -53,17 +53,17 @@ def validate_each(record, attribute, value)
5353
private
5454
# The check for an existing value should be run from a class that
5555
# isn't abstract. This means working down from the current class
56-
# (self), to the first non-abstract class. Since classes don't know
57-
# their subclasses, we have to build the hierarchy between self and
58-
# the record's class.
56+
# (self), to the first non-abstract class.
5957
def find_finder_class_for(record)
60-
class_hierarchy = [record.class]
61-
62-
while class_hierarchy.first != @klass
63-
class_hierarchy.unshift(class_hierarchy.first.superclass)
58+
current_class = record.class
59+
found_class = nil
60+
loop do
61+
found_class = current_class unless current_class.abstract_class?
62+
break if current_class == @klass
63+
current_class = current_class.superclass
6464
end
6565

66-
class_hierarchy.detect { |klass| !klass.abstract_class? }
66+
found_class
6767
end
6868

6969
def validation_needed?(klass, record, attribute)

0 commit comments

Comments
 (0)