跳至内容 跳至搜索

Active Model 值类型

所有属性类型的基类。此类还充当未指定类型的属性的默认类型。

方法
#
A
C
D
E
H
N
S
T
包含模块

属性

[R] limit
[R] precision
[R] scale

类公共方法

new(precision: nil, limit: nil, scale: nil)

使用三个基本配置设置初始化类型:精度、限制和比例。Value 基类未为这些设置定义行为。它仅使用它们进行相等性比较和哈希键生成。

# File activemodel/lib/active_model/type/value.rb, line 17
def initialize(precision: nil, limit: nil, scale: nil)
  super()
  @precision = precision
  @scale = scale
  @limit = limit
end

实例公共方法

==(other)

也称为:eql?
# File activemodel/lib/active_model/type/value.rb, line 121
def ==(other)
  self.class == other.class &&
    precision == other.precision &&
    scale == other.scale &&
    limit == other.limit
end

as_json(*)

# File activemodel/lib/active_model/type/value.rb, line 144
def as_json(*)
  raise NoMethodError
end

assert_valid_value(_)

# File activemodel/lib/active_model/type/value.rb, line 133
def assert_valid_value(_)
end

cast(value)

Type 将值从用户输入(例如来自设置器)转换为适当的类型。此值可能是来自表单生成器的字符串,也可能是传递给设置器的 Ruby 对象。目前无法区分它来自哪个来源。

此方法的返回值将从 ActiveRecord::AttributeMethods::Read#read_attribute 返回。另见:Value#cast_value.

value 原始输入,与属性设置器提供的相同。

# File activemodel/lib/active_model/type/value.rb, line 57
def cast(value)
  cast_value(value) unless value.nil?
end

changed?(old_value, new_value, _new_value_before_type_cast)

确定值是否已更改以进行脏检查。old_valuenew_value 将始终进行类型转换。类型不需要覆盖此方法。

# File activemodel/lib/active_model/type/value.rb, line 84
def changed?(old_value, new_value, _new_value_before_type_cast)
  old_value != new_value
end

changed_in_place?(raw_old_value, new_value)

确定可变值自读取后是否已修改。默认情况下返回 false。如果您的类型返回一个可以被修改的对象,您应该覆盖此方法。您需要:

  • new_value 传递给 Value#serialize 并将其与 raw_old_value 进行比较

或者

raw_old_value 原始值,在传递给 deserialize 之前。

new_value 当前值,在类型转换之后。

# File activemodel/lib/active_model/type/value.rb, line 105
def changed_in_place?(raw_old_value, new_value)
  false
end

deserialize(value)

将值从数据库输入转换为适当的 Ruby 类型。此方法的返回值将从 ActiveRecord::AttributeMethods::Read#read_attribute 返回。默认实现只是调用 Value#cast.

value 原始输入,与数据库提供的相同。

# File activemodel/lib/active_model/type/value.rb, line 43
def deserialize(value)
  cast(value)
end

eql?(other)

别名:==

hash()

# File activemodel/lib/active_model/type/value.rb, line 129
def hash
  [self.class, precision, scale, limit].hash
end

serializable?(value)

如果此类型可以将 value 转换为数据库可用的类型,则返回 true。例如,布尔类型如果值参数是 Ruby 布尔值,则可以返回 true,但如果值参数是其他一些对象,则可能返回 false

# File activemodel/lib/active_model/type/value.rb, line 28
def serializable?(value)
  true
end

serialize(value)

将值从 Ruby 类型转换为数据库知道的类型。此方法返回的值应该是 StringNumericDateTimeSymboltruefalsenil

# File activemodel/lib/active_model/type/value.rb, line 65
def serialize(value)
  value
end

type()

Symbol 的形式返回唯一的类型名称。子类应该覆盖此方法。

# File activemodel/lib/active_model/type/value.rb, line 34
def type
end

实例私有方法

cast_value(value)

针对不需要对用户和数据库输入进行单独类型转换行为的类型的便捷方法。由 Value#cast 用于除 nil 之外的值调用。

# File activemodel/lib/active_model/type/value.rb, line 152
def cast_value(value) # :doc:
  value
end