布尔字段何时转换为 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

知道这很好,但是这些值什么时候真正“转变”为 truefalse

这是否与任何回调(例如 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?

这实际上取决于我们谈论的是哪种方法。但在大多数情况下,实际分配发生在任何回调 运行.

之前

参见: