En SQLite un índice único sobre un campo de texto es sensible a mayúsculas (case-sensitive), lo que quiere decir que podremos insertar un registro "Javier" y otro "javier" ya que se consideran diferentes.
En PostgreSQL un índice único sobre un campo de texto también es sensible a mayúsculas (case-sensitive), lo que quiere decir que podremos insertar un registro "Javier" y otro "javier" ya que se consideran diferentes.
Si queremos aplicar una validación a nuestro modelo que impida crear un registro duplicado, deberemos añadir:
validates :name, uniqueness: true
O su equivalente
validates :name, uniqueness: { case_sensitive: true }
Siendo esta validación igualmente sensible a mayúsculas, comportándose de la misma forma que se comporta el índice de la base de datos.
Si queremos que no sea sensible a mayúsculas y que se consideren el mismo registro "javier" que "Javier", deberemos indicarlo en la validación:
validates :name, uniqueness: { case_sensitive: false }
Aunque esto sólo nos lo garantiza a nivel de código, porque el índice de la base de datos seguirá siendo sensible a mayúsculas y podría llegar a darse una condición de carrera en la que se inserten dos registros que no cumplan el criterio de unicidad que esperamos. Esto puede ser especialmente un problema en campos tipo email 1.