diff --git a/README.md b/README.md
index 9751ec7..e38ad60 100644
--- a/README.md
+++ b/README.md
@@ -62,7 +62,7 @@ Constraints:
| `null: false` | `validates ... presence: true` |
| `limit: 100` | `validates ... length: { maximum: 100 }` |
| `unique: true` | `validates ... uniqueness: true` |
-| `unique: true, case_sensitive: false`
(If [schema_plus_pg_indexes](https://github.com/SchemaPlus/schema_plus_pg_indexes) is also in use) | `validates ... uniqueness: { case_sensitive: false }` |
+| `unique: true, case_sensitive: false`
(Requires [schema_plus_pg_indexes](https://github.com/SchemaPlus/schema_plus_pg_indexes) for PostgreSQL) | `validates ... uniqueness: { case_sensitive: false }` |
Data types:
diff --git a/lib/schema_validations/active_record/validations.rb b/lib/schema_validations/active_record/validations.rb
index d76d93d..d9be6d5 100644
--- a/lib/schema_validations/active_record/validations.rb
+++ b/lib/schema_validations/active_record/validations.rb
@@ -169,7 +169,7 @@ def add_uniqueness_validation(column) #:nodoc:
options = {}
options[:scope] = scope if scope.any?
options[:allow_nil] = true
- options[:case_sensitive] = false if has_case_insensitive_index?(column, scope)
+ options[:case_sensitive] = false if column_is_case_insensitive?(column) or has_case_insensitive_index?(column, scope)
options[:if] = (proc do |record|
if scope.all? { |scope_sym| record.public_send(:"#{scope_sym}?") }
record.public_send(:"#{column.name}_changed?")
@@ -181,6 +181,10 @@ def add_uniqueness_validation(column) #:nodoc:
validate_logged :validates_uniqueness_of, name, options
end
+ def column_is_case_insensitive?(column)
+ column.respond_to?(:collation) && column.respond_to?(:case_sensitive?) && ! column.case_sensitive?
+ end
+
def has_case_insensitive_index?(column, scope)
indexed_columns = (scope + [column.name]).map(&:to_sym).sort
index = column.indexes.select { |i| i.unique && i.columns.map(&:to_sym).sort == indexed_columns }.first