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