Spec-Zone.ru › Ruby on Rails 7.2

модуль ActiveRecord::Normalization::ClassMethods

Общедоступные методы экземпляров

normalize_value_for(name, value) Показать исходный код
# 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"
normalizes(*names, with:, apply_to_nil: false) Показать исходный код
# 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.

Spec-Zone.ru

Настройки Оффлайн Что нового Помощь О нас
Spec-Zone .ru
спецификации, руководства, описания, API