我曾经以为db/schema.rb
在Rails
项目中存储了数据库架构,以便ActiveRecord
可以知道它具有什么表/列。
但是更早之前,我惊讶地注意到,删除后我的项目可以正常运行db/schema.rb
!
那么,既然Rails
没有它就可以工作,那么schema.rb
真正的作用是什么?
Answers:
该schema.rb
主要有两个目的:
它记录了数据库模式的最终当前状态。通常,尤其是当您有多个迁移时,仅从迁移中就很难推断出模式。有了礼物schema.rb
,您可以在那里看看。ActiveRecord本身确实不会使用它。它将在运行时内省数据库,因为这比期望用户保持schema.rb
最新状态要安全得多。但是,为避免使开发人员感到困惑,您应始终维护一个与迁移有关的最新文件。
测试使用它来填充数据库模式。因此,rake db:schema:dump
通常将其作为耙test:prepare
运行的一部分。目的是测试数据库的架构与当前开发数据库完全匹配。
shared-models
每个应用程序都依赖的单独的仓库中(简称为)。我们将迁移放入shared-models
,但在其中一个应用(例如app1)中运行它。然后,schema.rb
在迁移期间for app1会自动更新,但schema.rb
其他应用程序的文件不会更新。您仍然需要将更新的schema.rb
文件从app1复制到其他应用程序,以便它们都是最新的
迁移(尽管可能如此)并非数据库架构的权威来源。该角色属于db / schema.rb或Active Record通过检查数据库生成的SQL文件。它们不是为了进行编辑而设计的,它们仅表示数据库的当前状态。
无需(并且容易出错)通过重播整个迁移历史记录来部署应用程序的新实例。只需将当前模式的描述加载到数据库中,将更加简单快捷。
例如,这就是创建测试数据库的方式:将当前的开发数据库转储(到db / schema.rb或db / structure.sql),然后加载到测试数据库中。
如果要快速查看Active Record对象具有哪些属性,则架构文件也很有用。此信息不在模型的代码中,并且经常分散在多个迁移中,但是可以在模式文件中很好地汇总这些信息。如果需要,annotate_models gem会在每个模型的顶部自动添加和更新注释,以汇总架构。
schema.rb
最新状态,因为同一文件上的注释说明了这一点:请注意,此schema.rb定义是数据库架构的权威来源。