跳至內容 跳至搜尋
方法
N

實例公開方法

normalize_value_for(名稱, 值)

使用針對 名稱 宣告的正規化,將給定的 正規化。

範例

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 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 之前建立,並且您的應用程式封送目標模型的實例(例如在快取時),那麼您應該透過 config.load_defaults 7.1config.active_record.marshalling_format_version = 7.1ActiveRecord.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"
# 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