Ruby on rails 模型验证是否应该反映数据库列约束

Ruby on rails 模型验证是否应该反映数据库列约束,ruby-on-rails,activerecord,Ruby On Rails,Activerecord,我有下表: class CreatePosts < ActiveRecord::Migration[6.0] def change create_table :posts do |t| t.belongs_to :site, null: false t.bigint :post_id, null: false t.string :title, null: false t.string :url, null: false

我有下表:

class CreatePosts < ActiveRecord::Migration[6.0]
  def change
    create_table :posts do |t|
      t.belongs_to :site, null: false
      t.bigint :post_id, null: false
      t.string :title, null: false
      t.string :url, null: false
      t.text :body, null: false

      t.timestamps
    end
  end
end
class CreatePosts
您可以看到,任何属性都不能有值
null
。我应该在
Post
模型中反映这些约束吗?这是一种好的做法吗


现在,如果我试图保存一篇没有所有属性的文章,ActiveRecord将引发一个MySQL错误,我想避免这个错误,并给出一个更简洁的错误。

让我先看看这篇文章中巨型机器人与其他巨型机器人的碰撞:

在这篇文章中,德里克·普赖尔(Derek Prior)提出,几乎没有必要同时做这两件事:

不必使用模式约束来支持每个验证,也不必将模式约束反映为模型验证。当您决定哪一个适合您的用例时,有几个问题值得问

  • 您是否试图防止将坏数据写入数据库?如果是,则必须具有模式约束。不幸的是,Omakase Rails本身并不支持Postgres支持的所有常见约束的创建和模式转储,因此您在决策时也必须权衡这一点

  • 您是否在防止应用程序用户可以自行修复的错误?如果是这样,您应该使用模型验证


  • 我建议阅读整篇文章(我已经读过了,并且发现自己每隔几个月就会回来读一次)。

    博客文章中更相关的部分是下一节,他们讨论了用户可以编辑的内容和不能编辑的内容之间的区别,第一类值的问题应该有验证(和数据库约束)因为它们的问题是用户错误,所以第二类值没有验证(但有数据库约束),因为存在应用程序错误。