【问题标题】:Migration are run regardless of the branch [duplicate]无论分支如何,迁移都会运行[重复]
【发布时间】:2016-11-16 09:12:17
【问题描述】:

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

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

说,我在分支A 上创建了Foo 模型和对应的表foos,运行迁移并切换到另一个分支。

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

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

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

【问题讨论】:

    标签: ruby-on-rails migration ruby-on-rails-4.2 schema.rb


    【解决方案1】:

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

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

    【讨论】:

    • 我认为回滚在这里是一个有效的选项,但我想建立一些更健壮的东西,这样我每次切换分支时都不必回滚。你能想到什么吗?
    • @AndreyDeineko 如何编写 git hook 脚本来比较主分支和当前分支之间的迁移版本以及回滚。它在结帐新分支时执行
    【解决方案2】:

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

    【讨论】:

      【解决方案3】:

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

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

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

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

      【讨论】:

      • 它不在.gitignore
      猜你喜欢
      • 1970-01-01
      • 2012-09-24
      • 2017-01-15
      • 1970-01-01
      • 2018-07-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2021-11-24
      相关资源
      最近更新 更多