【问题标题】:When do boolean fields transform to true/false in Rails?在 Rails 中布尔字段何时转换为真/假?
【发布时间】:2021-01-15 12:01:43
【问题描述】:

在与队友的对话中,我们问自己,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)中保存值将在 ActiveRecord 记录中保存为false(当然,如果列类型是布尔值)。所有其他值(我认为)将另存为true

知道这一点很好,但这些值何时真正“变成”truefalse

这可以与任何回调(例如before_validation)相提并论吗?特别是在我们的案例中,我们能否确保它在运行验证之前运行?

如果有人甚至在 rails 代码中找到了这一点,那么指出这一点会很棒:)

【问题讨论】:

  • 您对此感到好奇有什么原因吗?只是出于好奇而询问。
  • 同样的原因,纯粹的好奇:D

标签: ruby-on-rails rails-activerecord


【解决方案1】:

当你在模型中设置一个值时,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 通过遍历键和值并调用适当的设置器来处理从哈希中设置属性。

ActiveModel::Attributes 是以前在 Rails 5 中公开的私有 API,它构成了 ActiveRecord::Attributes 的基石,ActiveRecord::Attributes 是一种更专业的实现,其中模型由数据库表支持。在ActiveRecord::Attributes 中,类型转换也在setter 中完成,但它还包括脏跟踪之类的东西,甚至在它们被类型转换之前就跟踪属性。 ActiveRecord::Attributes 不仅处理用户输入的类型转换,还处理与数据库之间的类型转换值。

ActiveRecord 还包括大量用于分配和更新方法的方法,这些方法在 they fire callbacks or validations 中有所不同。

“这可以与任何回调(例如 before_validation)相媲美吗?尤其是在我们的案例中,我们能否确保它在运行验证之前运行?

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

见:

【讨论】:

    猜你喜欢
    • 2020-01-05
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-07-11
    相关资源
    最近更新 更多