aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorRyuta Kamizono <kamipo@gmail.com>2019-03-06 10:13:04 +0900
committerRyuta Kamizono <kamipo@gmail.com>2019-03-07 10:53:53 +0900
commit1aece76e2548672e5a56c1459c0c1a150ea4f175 (patch)
treea61568de07792b0ff8df1bf730aa7eb4237f3dbc
parent2beb0b473606c60e5e1cbb3dac06ffa96f8ce456 (diff)
downloadrails-1aece76e2548672e5a56c1459c0c1a150ea4f175.tar.gz
rails-1aece76e2548672e5a56c1459c0c1a150ea4f175.tar.bz2
rails-1aece76e2548672e5a56c1459c0c1a150ea4f175.zip
Move all Arel constructions from uniqueness validator into connection adapter
-rw-r--r--activerecord/lib/active_record/connection_adapters/abstract_adapter.rb2
-rw-r--r--activerecord/lib/active_record/connection_adapters/abstract_mysql_adapter.rb7
-rw-r--r--activerecord/lib/active_record/validations/uniqueness.rb4
3 files changed, 6 insertions, 7 deletions
diff --git a/activerecord/lib/active_record/connection_adapters/abstract_adapter.rb b/activerecord/lib/active_record/connection_adapters/abstract_adapter.rb
index c2087b8216..202187a047 100644
--- a/activerecord/lib/active_record/connection_adapters/abstract_adapter.rb
+++ b/activerecord/lib/active_record/connection_adapters/abstract_adapter.rb
@@ -522,7 +522,7 @@ module ActiveRecord
end
def default_uniqueness_comparison(attribute, value, klass) # :nodoc:
- case_sensitive_comparison(attribute, value)
+ attribute.eq(value)
end
def case_sensitive_comparison(attribute, value) # :nodoc:
diff --git a/activerecord/lib/active_record/connection_adapters/abstract_mysql_adapter.rb b/activerecord/lib/active_record/connection_adapters/abstract_mysql_adapter.rb
index d99c9b9d02..a518b897a0 100644
--- a/activerecord/lib/active_record/connection_adapters/abstract_mysql_adapter.rb
+++ b/activerecord/lib/active_record/connection_adapters/abstract_mysql_adapter.rb
@@ -461,15 +461,16 @@ module ActiveRecord
def default_uniqueness_comparison(attribute, value, klass) # :nodoc:
column = column_for_attribute(attribute)
- if column.collation && !column.case_sensitive?
+ if column.collation && !column.case_sensitive? && !value.nil?
ActiveSupport::Deprecation.warn(<<~MSG.squish)
Uniqueness validator will no longer enforce case sensitive comparison in Rails 6.1.
To continue case sensitive comparison on the :#{attribute.name} attribute in #{klass} model,
pass `case_sensitive: true` option explicitly to the uniqueness validator.
MSG
+ attribute.eq(Arel::Nodes::Bin.new(value))
+ else
+ super
end
-
- super
end
def case_sensitive_comparison(attribute, value) # :nodoc:
diff --git a/activerecord/lib/active_record/validations/uniqueness.rb b/activerecord/lib/active_record/validations/uniqueness.rb
index dc1be73a60..3172aa2078 100644
--- a/activerecord/lib/active_record/validations/uniqueness.rb
+++ b/activerecord/lib/active_record/validations/uniqueness.rb
@@ -60,9 +60,7 @@ module ActiveRecord
comparison = relation.bind_attribute(attribute, value) do |attr, bind|
return relation.none! if bind.unboundable?
- if bind.nil?
- attr.eq(bind)
- elsif !options.key?(:case_sensitive)
+ if !options.key?(:case_sensitive) || bind.nil?
klass.connection.default_uniqueness_comparison(attr, bind, klass)
elsif options[:case_sensitive]
klass.connection.case_sensitive_comparison(attr, bind)