【问题标题】:Validates presense vs null false in Rails models/tables验证 Rails 模型/表中的存在与 null false
【发布时间】:2013-11-14 08:33:50
【问题描述】:

我在玩 Rails 管理员时发现了一些东西。

在模型中定义如下的属性,在 Rails 管理中被视为“必需”

 validates :user, presence: true

但是,在表(模式/迁移)中定义如下的属性仍然算作“可选”

t.datetime "created_at",:null => false

我会假设这两者是相同的,除了验证错误弹出的级别。我错了还是这是 Rails 管理员错误?这两者是否确保成功保存字段时需要此字段还是有区别?

【问题讨论】:

    标签: ruby-on-rails ruby rails-admin


    【解决方案1】:

    添加:null => false 意味着这是一个数据库限制,即在任何情况下数据库都不允许空值。

    添加presence: true 是模型级别的验证,因此将在对象插入数据库之前进行。可能存在您想要打破这些验证的情况(例如边缘情况或在您的规范中)然后您可以使用:validates => false 跳过验证,并且对象仍将进入数据库,但具有空数据库限制,这不会发生。

    【讨论】:

    • 有趣,不知道我可以选择退出,可以这么说,验证。但除此之外,我可以说在外部行为是相同的吗?即,在任何一种情况下,除非分配此属性,否则我将无法保存?
    • 是的,前提是您始终使用 rails 方法并且不通过validates => false
    • 您能否分享一个具体示例,说明您为什么更愿意在模型中验证而不是在数据库中验证?
    【解决方案2】:
    t.datetime "created_at",:null => false 
    

    告诉数据库不要接受空值。 而validates :user, presence: true 就像告诉 Rails 应用程序不要接受空值。 但是最好将它们集成在一起,例如使用 :null => false 将其注册到 Rails 以进行模型验证。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2011-03-20
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多