модуль ActiveRecord::Normalization::ClassMethods
Публичные методы экземпляров
# File activerecord/lib/active_record/normalization.rb, line 108 def normalize_value_for(name, value) type_for_attribute(name).cast(value) end
Нормализует заданное value с использованием нормализаций, объявленных для name.
Примеры
class User < ActiveRecord::Base
normalizes :email, with: -> email { email.strip.downcase }
end
User.normalize_value_for(:email, " CRUISE-CONTROL@EXAMPLE.COM\n")
# => "cruise-control@example.com"
# File activerecord/lib/active_record/normalization.rb, line 88
def normalizes(*names, with:, apply_to_nil: false)
names.each do |name|
attribute(name) do |cast_type|
NormalizedValueType.new(cast_type: cast_type, normalizer: with, normalize_nil: apply_to_nil)
end
end
self.normalized_attributes += names.map(&:to_sym)
end Объявляет нормализацию для одного или нескольких атрибутов. Нормализация применяется при присвоении или обновлении атрибута, и нормализованное значение будет сохранено в базе данных. Нормализация также применяется к соответствующему ключевому аргументу методов запроса. Это позволяет создавать запись, а затем выполнять запросы, используя ненормализованные значения.
Однако, чтобы избежать путаницы, нормализация не будет применена при извлечении атрибута из базы данных. Это означает, что если запись была сохранена до объявления нормализации, атрибут записи не будет нормализован, пока ему не будет присвоено новое значение или он не будет явно мигрирован через Normalization#normalize_attribute.
Поскольку нормализация может применяться несколько раз, она должна быть идемпотентной. Другими словами, применение нормализации более одного раза должно давать тот же результат, что и применение её один раз.
По умолчанию нормализация не будет применяться к nil значениям. Это поведение можно изменить с помощью опции :apply_to_nil.
Обратите внимание, что если ваш проект был создан до Rails 7.1, и ваш проект маршалит экземпляры целевой модели (например, при кэшировании), то вы должны установить ActiveRecord.marshalling_format_version на 7.1 или выше, либо через config.load_defaults 7.1 либо через config.active_record.marshalling_format_version = 7.1. В противном случае, Marshal может попытаться сериализовать нормализацию Proc и вызвать TypeError.
Параметры
-
:with- Любой вызываемый объект, который принимает значение атрибута в качестве единственного аргумента и возвращает его в нормализованном виде. -
:apply_to_nil- Применять ли нормализацию кnilзначениям. По умолчаниюfalse.
Примеры
class User < ActiveRecord::Base
normalizes :email, with: -> email { email.strip.downcase }
normalizes :phone, with: -> phone { phone.delete("^0-9").delete_prefix("1") }
end
user = User.create(email: " CRUISE-CONTROL@EXAMPLE.COM\n")
user.email # => "cruise-control@example.com"
user = User.find_by(email: "\tCRUISE-CONTROL@EXAMPLE.COM ")
user.email # => "cruise-control@example.com"
user.email_before_type_cast # => "cruise-control@example.com"
User.where(email: "\tCRUISE-CONTROL@EXAMPLE.COM ").count # => 1
User.where(["email = ?", "\tCRUISE-CONTROL@EXAMPLE.COM "]).count # => 0
User.exists?(email: "\tCRUISE-CONTROL@EXAMPLE.COM ") # => true
User.exists?(["email = ?", "\tCRUISE-CONTROL@EXAMPLE.COM "]) # => false
User.normalize_value_for(:phone, "+1 (555) 867-5309") # => "5558675309"
© 2004–2021 David Heinemeier Hansson
Licensed under the MIT License.