跳至内容 跳至搜索
命名空间
方法
R

常量

BigInteger = ActiveModel::Type::BigInteger
 

Active Model BigInteger 类型

用于表示可以序列化为无限字节数的整数的属性类型。此类型在:big_integer键下注册。

class Person
  include ActiveModel::Attributes

  attribute :id, :big_integer
end

person = Person.new
person.id = "18_000_000_000"

person.id # => 18000000000

所有强制转换和序列化操作都与标准ActiveModel::Type::Integer类型相同。

Binary = ActiveModel::Type::Binary
 

Active Model Binary 类型

用于表示二进制数据的属性类型。此类型在:binary键下注册。

非字符串值将使用其to_s方法强制转换为字符串。

Boolean = ActiveModel::Type::Boolean
 

Active Model Boolean 类型

一个类似于布尔类型的类,包括用户输入强制转换规则。

  • "false""f""0"0FALSE_VALUES中的任何其他值都将强制转换为false

  • 空字符串将强制转换为nil

  • 所有其他值将强制转换为true

Decimal = ActiveModel::Type::Decimal
 

Active Model Decimal 类型

用于表示十进制高精度浮点数的属性类型。它在:decimal键下注册。

class BagOfCoffee
  include ActiveModel::Attributes

  attribute :weight, :decimal
end

Numeric实例将转换为BigDecimal实例。任何其他对象都使用其to_d方法进行强制转换,除了空字符串,它们将强制转换为nil。如果未定义to_d方法,则该对象将使用to_s转换为字符串,然后使用to_d进行强制转换。

bag = BagOfCoffee.new

bag.weight = 0.01
bag.weight # => 0.1e-1

bag.weight = "0.01"
bag.weight # => 0.1e-1

bag.weight = ""
bag.weight # => nil

bag.weight = :arbitrary
bag.weight # => nil (the result of `.to_s.to_d`)

Decimal精度默认值为18,可以在声明属性时进行自定义

class BagOfCoffee
  include ActiveModel::Attributes

  attribute :weight, :decimal, precision: 24
end
Float = ActiveModel::Type::Float
 

Active Model Float 类型

用于表示浮点数的属性类型。它在:float键下注册。

class BagOfCoffee
  include ActiveModel::Attributes

  attribute :weight, :float
end

使用其to_f方法强制转换值,但以下字符串除外

  • 空字符串将强制转换为nil

  • "Infinity"将强制转换为Float::INFINITY

  • "-Infinity"将强制转换为-Float::INFINITY

  • "NaN"将强制转换为Float::NAN

    bag = BagOfCoffee.new

    bag.weight = “0.25” bag.weight # => 0.25

    bag.weight = “” bag.weight # => nil

    bag.weight = “NaN” bag.weight # => Float::NAN

ImmutableString = ActiveModel::Type::ImmutableString
 

Active Model ImmutableString 类型

用于表示不可变字符串的属性类型。它将传入的值强制转换为冻结字符串。

class Person
  include ActiveModel::Attributes

  attribute :name, :immutable_string
end

person = Person.new
person.name = 1

person.name # => "1"
person.name.frozen? # => true

使用其to_s方法将值强制转换为字符串。Boolean值处理方式不同,但是:true将强制转换为"t"false将强制转换为"f"。这些字符串可以在声明属性时进行自定义

class Person
  include ActiveModel::Attributes

  attribute :active, :immutable_string, true: "aye", false: "nay"
end

person = Person.new
person.active = true

person.active # => "aye"
Integer = ActiveModel::Type::Integer
 

Active Model Integer 类型

用于表示整数的属性类型。此类型在:integer键下注册。

class Person
  include ActiveModel::Attributes

  attribute :age, :integer
end

使用其to_i方法强制转换值,但空字符串除外,它们将强制转换为nil。如果to_i方法未定义或引发错误,则该值将强制转换为nil

person = Person.new

person.age = "18"
person.age # => 18

person.age = ""
person.age # => nil

person.age = :not_an_integer
person.age # => nil (because Symbol does not define #to_i)

Serialization也遵循相同的原则。例如,非数字字符串将序列化为nil

Serialization还验证整数是否可以使用有限数量的字节存储。如果不能,则会引发ActiveModel::RangeError。默认限制为4个字节,可以在声明属性时进行自定义

class Person
  include ActiveModel::Attributes

  attribute :age, :integer, limit: 6
end
String = ActiveModel::Type::String
 

Active Model String 类型

用于表示字符串的属性类型。它在:string键下注册。

此类是ActiveModel::Type::ImmutableString的专门化。它以相同的方式执行强制转换,并且可以以相同的方式配置。但是,它考虑了可变字符串,因此脏数据跟踪可以正确检查字符串是否已更改。

Value = ActiveModel::Type::Value
 

Active Model Value 类型

所有属性类型的基类。此类也用作未指定类型的属性的默认类型。

类公共方法

register(type_name, klass = nil, **options, &block)

将新类型添加到注册表,允许通过ActiveRecord::Base.attribute以符号的形式引用它。如果您的类型仅用于特定数据库适配器,则可以通过传递adapter: :postgresql来实现。如果您的类型与当前适配器的本机类型具有相同的名称,则除非您指定:override选项,否则会引发异常。override: true将导致使用您的类型而不是本机类型。override: false将导致如果存在本机类型,则使用本机类型而不是您的类型。

# File activerecord/lib/active_record/type.rb, line 37
def register(type_name, klass = nil, **options, &block)
  registry.register(type_name, klass, **options, &block)
end