1

我在不同的分支上工作,在这些分支上有迁移文件。有一个schema.rb文件。

我的问题是,无论我目前在哪个分支上,运行迁移schema.rb都会以某种方式改变,就好像它考虑了所有分支上的所有迁移一样。

说,我已经在具有相应表Foo的分支上创建了模型,运行迁移并切换到另一个分支。Afoos

在我当前没有表bars的分支上运行其他迁移(比如创建表) ,创建它:Bfoos

# while on branch B
Foo
#=> NameError: uninitialized constant Foo
ActiveRecord::Base.connection.table_exists?('foos')
#=> true

问题:如何schema.rb仅根据当前分支上的迁移进行更改?

4

3 回答 3

4

db:migratedb:rollback作业从用户数据库模式写入schema.rb文件,而不是从用户迁移脚本。即使您更改了 git 分支,您的数据库状态也不会更改。所以foos表存在但Foo模型不存在。

我的答案:在结帐分支之前回滚,或者每次结帐分支时都编写 git hook 脚本进行回滚

于 2016-11-16T09:25:24.013 回答
2

使用每个分支数据库和连接设置。

于 2016-11-16T10:34:03.733 回答
1

你可能schema.rb在 git 上被忽略了。一种解决方案是不要忽略此文件。查看.gitignore项目的根文件夹并从中取出 schema.rb。

如果它不在.gitignore您的问题中,则与schema.rb每个分支都应该不同。问题可能是您只有一个本地数据库文件,并且您正在从同一数据库上的不同分支运行迁移,这就是您得到:

ActiveRecord::Base.connection.table_exists?('foos')
#=> true

您应该为每个分支拥有不同的数据库副本,并在更改您正在处理的分支时更改它,或者使用不同的配置config/databases.yml,环境变量或手动更改数据库文件名。

于 2016-11-16T09:45:43.120 回答