модуль ActiveRecord::Normalization::ClassMethods
Общедоступные методы экземпляров
# File activerecord/lib/active_record/normalization.rb, line 106 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)
decorate_attributes(names) do |name, cast_type|
NormalizedValueType.new(cast_type: cast_type, normalizer: with, normalize_nil: apply_to_nil)
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.