Spec-Zone.ru › Ruby on Rails 7.1

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

Публичные методы экземпляров

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

Spec-Zone.ru

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