从rails控制台运行迁移

raf*_*mvc 56 ruby-on-rails ruby-on-rails-3.1

有没有办法在控制台上运行db:migrate和db:rollback的rake命令?

很难等待rails环境加载!

Hom*_*man 82

在控制台中:

ActiveRecord::Migration.remove_column :table_name, :column_name
Run Code Online (Sandbox Code Playgroud)

  • 完成此操作后,您需要手动更新架构。 (2认同)

Ben*_*ret 69

这将允许您在不重新加载整个rails环境的情况下进行迁移:

ActiveRecord::Migrator.migrate "db/migrate"
Run Code Online (Sandbox Code Playgroud)

和回滚:

# 3 is the number of migration to rollback, optional, defaults to 1
ActiveRecord::Migrator.rollback "db/migrate", 3
Run Code Online (Sandbox Code Playgroud)

  • 请注意,如果您使用的是Mongoid,则它是相同的:`Mongoid :: Migrator.migrate"db/migrate"` (2认同)
  • 对于较新的 Rails 版本,您还需要传递 `schema_migration`:`ActiveRecord::MigrationContext.new(ActiveRecord::Migrator.migrations_paths, ActiveRecord::Base.connection.schema_migration)` (2认同)

kiz*_*zx2 24

我发现从控制台运行一些迁移命令更简洁的另一种方法是:

ActiveRecord::Schema.define do
  create_table :foo do |t|
    t.string  :bar
    t.timestamps
  end
end
Run Code Online (Sandbox Code Playgroud)

这具有以下优点:块内的内容与仅从真实的迁移文件/中复制和粘贴随机内容兼容schema.rb.


小智 8

对于Rails 5.2,可接受的答案已被删除并替换为

ActiveRecord::MigrationContext.new("db/migrate").migrate
Run Code Online (Sandbox Code Playgroud)

请注意,因为将来的rails版本会添加多个数据库连接,所以这可能也会更改


Sha*_*man 7

对于 Rails 5 和 Rails 6:

ActiveRecord::Base.connection.migration_context.migrate
Run Code Online (Sandbox Code Playgroud)

对于 Rails 3 和 Rails 4:

ActiveRecord::Migrator.migrate 'db/migrate'
Run Code Online (Sandbox Code Playgroud)


gro*_*ser 6

我需要假装运行迁移以解除部署的阻塞,这可以通过以下方式完成:

class Mig < ActiveRecord::Base; self.table_name = 'schema_migrations';end
Mig.create! version: '20180611172637'
Run Code Online (Sandbox Code Playgroud)


dex*_*ter 5

您可以使用 %x[command]

%x[rake db:migrate]
Run Code Online (Sandbox Code Playgroud)

  • 这违背了不必等待 Rails 加载的目的。 (3认同)