布尔字段何时转换为 Rails 中的 true/false?
When do boolean fields transform to true/false in Rails?
在与队友的对话中,我们问自己什么时候 Rails 将赋予布尔字段的值转换为 true
/false
。
在Rails中,保存某个特定“FALSE_VALUES”的值(如false, 'FALSE', 0, '0'
...https://github.com/rails/rails/blob/6-1-stable/activemodel/lib/active_model/type/boolean.rb)将被保存为false
在 ActiveRecord 记录中(当然,如果列类型是布尔值)。所有其他值(我认为)将保存为 true
知道这很好,但是这些值什么时候真正“转变”为 true
或 false
?
这是否与任何回调(例如 before_validation
)具有可比性?特别是在我们的例子中,我们能否确保它 运行s 在验证之前 运行?
如果有人甚至能在 rails 代码中找到它的说明,那么指出它会很棒 :)
当您在模型中设置值时,setter 将对值进行类型转换:
class Thing
include ActiveModel::Model
include ActiveModel::Attributes
attribute :awesome, :boolean
end
t = Thing.new
t.awesome = "1"
t.awesome # true
如果您想进入流程,最直接的方法是重新定义 setter。
class Thing
include ActiveModel::Model
include ActiveModel::Attributes
attribute :awesome, :boolean
def awesome=(value)
# do something
super
end
end
当您从属性的散列初始化、创建或更新模型时,ActiveModel::AttributeAssignment 通过遍历键和值并调用适当的 setter 来处理从散列设置属性。
ActiveModel::Attributes
是以前私有的 API,在 Rails 5 中公开,它构成了 ActiveRecord::Attributes
的基石,ActiveRecord::Attributes
是模型更专业的实现由数据库 table 支持。在 ActiveRecord::Attributes
中,类型转换也在 setter 中完成,但它还包括脏跟踪之类的东西,甚至在属性被类型转换之前就对其进行跟踪。 ActiveRecord::Attributes
不仅处理用户输入的类型转换,而且还处理进出数据库的值的类型转换。
ActiveRecord 还包括大量用于分配和更新方法的方法,这些方法在 they fire callbacks or validations.
中有所不同
"Is this comparable to any callback (e.g. before_validation)? In our case especially, can we make sure it runs before validations are run?
这实际上取决于我们谈论的是哪种方法。但在大多数情况下,实际分配发生在任何回调 运行.
之前
参见:
在与队友的对话中,我们问自己什么时候 Rails 将赋予布尔字段的值转换为 true
/false
。
在Rails中,保存某个特定“FALSE_VALUES”的值(如false, 'FALSE', 0, '0'
...https://github.com/rails/rails/blob/6-1-stable/activemodel/lib/active_model/type/boolean.rb)将被保存为false
在 ActiveRecord 记录中(当然,如果列类型是布尔值)。所有其他值(我认为)将保存为 true
知道这很好,但是这些值什么时候真正“转变”为 true
或 false
?
这是否与任何回调(例如 before_validation
)具有可比性?特别是在我们的例子中,我们能否确保它 运行s 在验证之前 运行?
如果有人甚至能在 rails 代码中找到它的说明,那么指出它会很棒 :)
当您在模型中设置值时,setter 将对值进行类型转换:
class Thing
include ActiveModel::Model
include ActiveModel::Attributes
attribute :awesome, :boolean
end
t = Thing.new
t.awesome = "1"
t.awesome # true
如果您想进入流程,最直接的方法是重新定义 setter。
class Thing
include ActiveModel::Model
include ActiveModel::Attributes
attribute :awesome, :boolean
def awesome=(value)
# do something
super
end
end
当您从属性的散列初始化、创建或更新模型时,ActiveModel::AttributeAssignment 通过遍历键和值并调用适当的 setter 来处理从散列设置属性。
ActiveModel::Attributes
是以前私有的 API,在 Rails 5 中公开,它构成了 ActiveRecord::Attributes
的基石,ActiveRecord::Attributes
是模型更专业的实现由数据库 table 支持。在 ActiveRecord::Attributes
中,类型转换也在 setter 中完成,但它还包括脏跟踪之类的东西,甚至在属性被类型转换之前就对其进行跟踪。 ActiveRecord::Attributes
不仅处理用户输入的类型转换,而且还处理进出数据库的值的类型转换。
ActiveRecord 还包括大量用于分配和更新方法的方法,这些方法在 they fire callbacks or validations.
中有所不同"Is this comparable to any callback (e.g. before_validation)? In our case especially, can we make sure it runs before validations are run?
这实际上取决于我们谈论的是哪种方法。但在大多数情况下,实际分配发生在任何回调 运行.
之前参见: