Здесь много хороших ответов, особенно @ oma. Но есть еще одна вещь, которую вы можете попробовать - использовать пользовательскую сериализацию столбцов. Если вы не возражаете против хранения всего нижнего регистра в вашей базе данных, вы можете создать:
# lib/serializers/downcasing_string_serializer.rb
module Serializers
class DowncasingStringSerializer
def self.load(value)
value
end
def self.dump(value)
value.downcase
end
end
end
Тогда в вашей модели:
# app/models/my_model.rb
serialize :name, Serializers::DowncasingStringSerializer
validates_uniqueness_of :name, :case_sensitive => false
Преимущество этого подхода состоит в том, что вы все равно можете использовать все обычные средства поиска (включая find_or_create_by
) без использования пользовательских областей, функций или lower(name) = ?
в своих запросах.
Недостатком является то, что вы теряете информацию об корпусе в базе данных.