实例公共方法
normalize_value_for(name, value) 链接
使用为 name
声明的规范化规范化给定的 value
。
示例
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"
来源:显示 | 在 GitHub 上
# File activerecord/lib/active_record/normalization.rb, line 108 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.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"
来源:显示 | 在 GitHub 上
# 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