Rails:schema.rb是做什么的?

我曾经认为Rails项目中的db/schema.rb存储了数据库模式,因此ActiveRecord可以知道它具有哪个表/列。

但更早的时候,我惊讶地发现,我删除db/schema.rb后,我的项目正常运行!

所以,既然Rails没有它,那么schema.rb究竟做了什么呢?

schema.rb主要用于两个目的:

  1. 它logging数据库模式的最终当前状态。 通常情况下,特别是当您进行多次迁移时,仅仅从迁移中就很难推断出模式。 用目前的schema.rb ,你可以看看那里。 ActiveRecord本身确实不会使用它。 它会在运行时反思数据库,因为这样比期望用户保持schema.rb更新更安全。 但是为了避免开发人员的困惑,您应该始终维护一个与您的迁移最新的文件。

  2. 它被testing用来填充数据库模式。 像这样的rake db:schema:dump通常作为rake test:prepare一部分运行test:prepare run。 目的是testing数据库的模式与当前的开发数据库完全匹配。

Rails Documentation / 6.1什么是Schema文件?

迁移,尽pipe它们可能不是数据库模式的权威来源。 该angular色落在db / schema.rb或Active Record通过检查数据库生成的SQL文件中。 它们不是为编辑而devise的,它们只是表示数据库的当前状态。

通过重播整个迁移历史logging来部署应用程序的新实例是没有必要的(也很容易出错)。 只要在数据库中加载当前模式的描述就简单多了。

例如,这就是testing数据库的创build方式:将当前的开发数据库转储(db / schema.rb或db / structure.sql),然后加载到testing数据库中。

如果您想快速查看Active Record对象具有的属性,架构文件也很有用。 这些信息不在模型的代码中,经常分散​​在几个迁移中,但信息在模式文件中很好地概括。 如果您需要该function,annotate_models gem将自动添加并更新每个模型顶部的概述模式的注释。

Rails文档已经涵盖了你。