代码之家  ›  专栏  ›  技术社区  ›  Daniel Viglione

如果最新的迁移相同,Rails如何知道存在挂起的迁移?

  •  1
  • Daniel Viglione  · 技术社区  · 8 年前

    | 20180822231257 |
    | 20180822234804 |
    | 20180829011800 |
    | 20180924212812 |
    

    假设我使用以下迁移签出了项目的一个特定分支(下面我省略了db/migrate/*.rb文件的完整文件名):

    | 20180822231257 |
    | 20180822234804 |
    
    20180827225521
    20180828172831
    
    | 20180829011800 |
    
    20180911233144
    20180913172923
    
    | 20180924212812 |
    

    如您所见,不带管道的文件表示数据库的schema\u migrations文件中没有的mydb/migrate文件夹中的文件。

    现在,当我尝试运行rails时,出现以下错误:

    Migrations are pending. To resolve this issue, run:
    bin/rake db:migrate RAILS_ENV=development
    

    当我查看schema.rb时,我注意到这一行:

    ActiveRecord::Schema.define(version: 20180924212812) do
    

    但是,schema.rb包含一些不在我拥有的数据库中的代码,例如不在数据库中的某个迁移的create\u table语句:

      create_table "some_table", force: :cascade do |t|
        t.integer  "some_id",      limit: 4
        t.integer  "default_view", limit: 4
        t.datetime "created_at",             null: false
        t.datetime "updated_at",             null: false
      end
    

    因此,尽管最新的迁移版本是相同的,但是Rails是否检测到当前schema\u migrations表中不存在一些较旧的迁移?

    2 回复  |  直到 8 年前
        1
  •  1
  •   igor_rb    8 年前

    here

    def needs_migration?
      (migrations.collect(&:version) - get_all_versions).size > 0
    end
    
    def migrations
      migrations = migration_files.map do |file|
        version, name, scope = parse_migration_filename(file)
        raise IllegalMigrationNameError.new(file) unless version
        version = version.to_i
        name = name.camelize
    
        MigrationProxy.new(name, version, file, scope)
      end
    
      migrations.sort_by(&:version)
    end
    def migration_files
      paths = Array(migrations_paths)
      Dir[*paths.flat_map { |path| "#{path}/**/[0-9]*_*.rb" }]
    end
    

    db/migrate 从中减去所有版本 SchemaMigration

        2
  •  0
  •   Marcin Kołodziej    8 年前

    Rails创建 schema_migrations db/migrate 包含所有 version 桌子。

    的内容 schema.rb 是从数据库生成的,而不是从迁移生成的,因此,如果有一些迁移创建了其他表/列并删除了这些迁移,则架构将包含在完全运行时不存在的表 rake db:migrate:reset .