跳至内容 跳至搜索
方法
N

实例公有方法

normalize_value_for(name, value)

使用为 name 声明的规范化来规范给定的 value

示例

class User < ActiveRecord::Base
  normalizes :email, with: -> email { email.strip.downcase }
end

User.normalize_value_for(:email, " [email protected]\n")
# => "[email protected]"
# File activerecord/lib/active_record/normalization.rb, line 106
def normalize_value_for(name, value)
  type_for_attribute(name).cast(value)
end

normalizes(*names, with:, apply_to_nil: false)

为一个或多个属性声明规范化。当属性被赋值或更新时,会应用该规范化,并且规范化的值将被持久化到数据库。规范化也应用于查询方法的对应关键字参数。这允许使用非规范化的值创建记录,并在稍后使用这些值查询记录。

然而,为了避免混淆,当从数据库中获取属性时,不会应用规范化。这意味着,如果记录在声明规范化之前被持久化,则记录的属性将不会被规范化,直到它被赋值一个新值,或者通过 Normalization#normalize_attribute 显式迁移。

由于规范化可能被多次应用,它应该是幂等的。换句话说,多次应用规范化应该与只应用一次具有相同的结果。

默认情况下,规范化不会应用于 nil 值。可以使用 :apply_to_nil 选项更改此行为。

请注意,如果您的应用程序是在 Rails 7.1 之前创建的,并且您的应用程序对目标模型的实例进行了编组(例如,在缓存时),那么您应该将 ActiveRecord.marshalling_format_version 设置为 7.1 或更高版本,方法是使用 config.load_defaults 7.1config.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: " [email protected]\n")
user.email                  # => "[email protected]"

user = User.find_by(email: "\[email protected] ")
user.email                  # => "[email protected]"
user.email_before_type_cast # => "[email protected]"

User.where(email: "\[email protected] ").count         # => 1
User.where(["email = ?", "\[email protected] "]).count # => 0

User.exists?(email: "\[email protected] ")         # => true
User.exists?(["email = ?", "\[email protected] "]) # => false

User.normalize_value_for(:phone, "+1 (555) 867-5309") # => "5558675309"
# 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