4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
|
# File 'lib/patches/active_record/rails5/uniqueness_validator.rb', line 4
def validate_each(record, attribute, value)
klass = record.class
if klass.translates? && klass.translated?(attribute)
finder_class = klass.translation_class
finder_table = finder_class.arel_table
relation = build_relation(finder_class, finder_table, attribute, value).where(locale: Globalize.locale)
relation = relation.where.not(klass.reflect_on_association(:translations).foreign_key => record.send(:id)) if record.persisted?
translated_scopes = Array(options[:scope]) & klass.translated_attribute_names
untranslated_scopes = Array(options[:scope]) - translated_scopes
relation = relation.joins(:globalized_model) if untranslated_scopes.present?
untranslated_scopes.each do |scope_item|
scope_value = record.send(scope_item)
reflection = klass.reflect_on_association(scope_item)
if reflection
scope_value = record.send(reflection.foreign_key)
scope_item = reflection.foreign_key
end
relation = relation.where(find_finder_class_for(record).table_name => { scope_item => scope_value })
end
translated_scopes.each do |scope_item|
scope_value = record.send(scope_item)
relation = relation.where(scope_item => scope_value)
end
relation = relation.merge(options[:conditions]) if options[:conditions]
if relation.exists?
error_options = options.except(:case_sensitive, :scope, :conditions)
error_options[:value] = value
record.errors.add(attribute, :taken, error_options)
end
else
super(record, attribute, value)
end
end
|