【问题标题】:validates vs db check up in rails 3.1 for field presence在 rails 3.1 中验证 vs db 检查是否存在现场
【发布时间】:2012-05-21 03:39:45
【问题描述】:

在 rails 3.1 中,我们可以通过以下方式验证模型中字段的存在:

validates :name, :presence => true

在db迁移文件中,我们也可以这样做

t.string :name, :null => false

似乎 validates 在保存之前检查数据完整性,哪个更好。然而,数据库检查只发生在保存过程中,可能在中止之前已经开始实际保存。模型中的验证更好吗?非常感谢。

【问题讨论】:

  • 对模型的验证通常就足够了,尽管 rails 指南会说明您可能还想使用数据库约束的原因。我建议阅读指南的这一部分。 guides.rubyonrails.org/…

标签: ruby-on-rails ruby-on-rails-3.1


【解决方案1】:

在模型中编写验证通常是一种很好的做法,因为它更易于维护,可以在需要时轻松更改,并且将所有核心登录放在一个地方也很好。

当你只在db级别写这样的东西时,写测试用例就成了一个问题,当你回到你的后面时,你可能没有意识到你已经在db级别写了这样的“逻辑”。

实际上,我什至在模型中写入了我的“默认”值(尽管这可以讨论)。原因是默认选项是业务登录,因此需要在模型级别进行。

由于上述原因,在模型级别编写此类代码是一个好习惯。

【讨论】:

    【解决方案2】:

    这是一个老问题,但我今天偶然发现了它,我认为无论您使用的是 Rails 3.1 还是 Rails 6,答案都是一样的:这取决于

    数据库约束和模型验证都存在是有原因的。除了这两个之外,我认为还值得考虑客户端检查的位置。

    我的简短回答是:

    • 始终编写模型验证
    • 在大多数情况下使用数据库约束来备份它们
    • 有时会添加客户端检查

    与大多数事情一样,在学习时坚持这些简单的规则,你就不会出错。稍后你可以开始打破这些规则,一旦你知道你为什么要打破它们。

    我在post on my blog 中写下了我更长的(“这取决于”)答案(以及我对上述规则的原因)。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2014-10-15
      • 2021-07-22
      • 2011-09-29
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2011-02-20
      相关资源
      最近更新 更多