从架构中删除表 - Rails

Bit*_*ise 13 ruby ruby-on-rails rails-migrations

我想删除模式中的表.我在第一次启动项目时创建了数据库,并希望删除表.这样做的最佳方式是什么?

我试过rails g migration drop table :installs但是只是创建了一个空迁移?

架构:

create_table "installs", force: :cascade do |t|
    t.string   "email",                  default: "", null: false
    t.string   "encrypted_password",     default: "", null: false
    t.string   "reset_password_token"
    t.datetime "reset_password_sent_at"
    t.datetime "remember_created_at"
    t.integer  "sign_in_count",          default: 0,  null: false
    t.datetime "current_sign_in_at"
    t.datetime "last_sign_in_at"
    t.string   "current_sign_in_ip"
    t.string   "last_sign_in_ip"
    t.datetime "created_at",                          null: false
    t.datetime "updated_at",                          null: false
  end

add_index "installs", ["email"], name: "index_installs_on_email", unique: true
add_index "installs", ["reset_password_token"], name: "index_installs_on_reset_password_token", unique: true
Run Code Online (Sandbox Code Playgroud)

Luk*_*err 40

如果通过运行:或:创建空迁移
rails g migration DropInstalls
:
rails generate migration DropInstalls

然后,您可以将其添加到该空迁移中:

class DropInstalls < ActiveRecord::Migration
  def change
    drop_table :installs
  end
end
Run Code Online (Sandbox Code Playgroud)

然后rake db:migrate在命令行中运行,该命令行应删除Installs表

  • 如果它指出架构是一个自动生成的文件,那么这个答案会更完整,因此需要查看错误的内容. (2认同)

Wes*_*yAC 6

我发现使用Rails控制台解决这个问题最简单.假设您要从博客应用程序中删除"评论"表.您可以通过从命令行执行以下任务(例如,终端)来执行此操作.

第一步:

$ rails console 
Run Code Online (Sandbox Code Playgroud)

第二步:

$ ActiveRecord::Migration.drop_table(:comments)
Run Code Online (Sandbox Code Playgroud)

第三步:

$ rake db:migrate
Run Code Online (Sandbox Code Playgroud)

去检查一下schema.rb,看看桌子已被删除.

  • 这是一个非常糟糕的建议.如果您手动执行此操作,您的生产应用程序将无法知道该表需要被删除,并且您将不同步,这可能会导致很多问题.正确的答案是使用迁移来删除表. (20认同)