Ruby on rails 无论分支是什么,都会运行迁移

Ruby on rails 无论分支是什么,都会运行迁移,ruby-on-rails,migration,ruby-on-rails-4.2,schema.rb,Ruby On Rails,Migration,Ruby On Rails 4.2,Schema.rb,我在不同的分支上工作,这些分支上有迁移文件。有一个schema.rb文件 我的问题是,无论我当前在哪个分支上,运行迁移都会在某种程度上更改schema.rb,就好像它考虑了所有分支上的所有迁移一样 比如说,我在分支A上创建了具有相应表foos的Foo模型,运行迁移并切换到另一个分支 运行一些其他迁移(例如在我当前的分支B上创建表栏,其中没有foos表)将创建它: # while on branch B Foo #=> NameError: uninitialized constant Fo

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

我的问题是,无论我当前在哪个分支上,运行迁移都会在某种程度上更改schema.rb,就好像它考虑了所有分支上的所有迁移一样

比如说,我在分支A上创建了具有相应表foos的Foo模型,运行迁移并切换到另一个分支

运行一些其他迁移(例如在我当前的分支B上创建表栏,其中没有foos表)将创建它:

# while on branch B
Foo
#=> NameError: uninitialized constant Foo
ActiveRecord::Base.connection.table_exists?('foos')
#=> true
问题:如何使schema.rb仅根据当前分支上的迁移进行更改?

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

我的答案是:在签出分支之前回滚,或者每次签出分支时都编写git钩子脚本进行回滚

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

我的答案是:只需在签出分支之前回滚,或者每次签出分支时编写git钩子脚本进行回滚

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

如果它不在.gitignore中,那么您的问题与schema.rb无关,因为每个分支的问题应该不同。问题可能是您只有一个本地数据库文件,并且正在同一数据库上运行来自不同分支的迁移,这就是为什么您会得到:

ActiveRecord::Base.connection.table_exists?('foos')
#=> true
每个分支都应该有一个不同的数据库副本,并在更改正在处理的分支时对其进行更改,可以使用config/databases.yml、环境变量上的不同配置,也可以手动更改数据库文件名。

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

如果它不在.gitignore中,那么您的问题与schema.rb无关,因为每个分支的问题应该不同。问题可能是您只有一个本地数据库文件,并且正在同一数据库上运行来自不同分支的迁移,这就是为什么您会得到:

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

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

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

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

它不在。gitignoreit不在。gitignoreI认为回滚在这里是一个有效的选项,但我想建立一个更健壮的选项,这样我就不必每次切换分支时都回滚。你能想到什么吗?@AndreyDeineko写一个git钩子脚本,比较主分支和当前分支之间的迁移版本,并进行回滚。它在签出新分支时执行我认为回滚在这里是一个有效的选项,但我想建立一个更健壮的方法,这样我就不必每次切换分支时都回滚。你能想到什么吗?@AndreyDeineko写一个git钩子脚本,比较主分支和当前分支之间的迁移版本,并进行回滚。它在签出新分支时执行