移除Rails迁移后的模型

8

对我来说,创建模型、运行迁移、销毁模型,再次创建相同的模型时出现SQL异常似乎很奇怪:

project|master ⇒ rails g model name name
      invoke  active_record
      create    db/migrate/20130417185814_create_names.rb
      create    app/models/name.rb
project|master⚡ ⇒ rake db:migrate
==  CreateNames: migrating ====================================================
-- create_table(:names)
   -> 0.0020s
==  CreateNames: migrated (0.0021s) ===========================================
project|master⚡ ⇒ rails d model name
      invoke  active_record
      remove    db/migrate/20130417185814_create_names.rb
      remove    app/models/name.rb
project|master⚡ ⇒ rake db:migrate
project|master⚡ ⇒ rails g model name test
      invoke  active_record
      create    db/migrate/20130417185845_create_names.rb
      create    app/models/name.rb
project|master⚡ ⇒ rake db:migrate
==  CreateNames: migrating ====================================================
-- create_table(:names)
rake aborted!
An error has occurred, this and all later migrations canceled:

SQLite3::SQLException: table "names" already exists: CREATE TABLE "names" ("id" INTEGER PRIMARY KEY AUTOINCREMENT NOT NULL, "test" varchar(255), "created_at" datetime NOT NULL, "updated_at" datetime NOT NULL) /path/project/db/migrate/20130417185845_create_names.rb:3:in `change'
-- create_table("names", {:force=>true})
   -> 0.0100s
-- initialize_schema_migrations_table()
   -> 0.0025s
-- assume_migrated_upto_version(20130417185814, ["/path/project/db/migrate"])
   -> 0.0010s
You have 1 pending migrations:
  20130417185845 CreateNames
Run `rake db:migrate` to update your database then try again.

也许我做错了什么?迁移有删除表的代码 - 它只能用于回滚吗?
解决方法
删除模型和数据库表并生成一个新的相当容易:
1. 创建模型:rails g model user name 2. 执行迁移:rake db:migrate 3. 在实现某些功能时,突然想起需要删除模型 4. 回滚到特定的迁移:rake db:migrate:down VERSION=20130417185814,其中20130417185814是迁移 ID(可以在rake db:migrate:status中看到) 5. 删除模型:rails d model user 6. 突然想起需要该模型,但是带有其他字段 7. 创建模型:rails g model user email group:references 8. 成功迁移数据库:rake db:migrate
3个回答

9
rails d model name 

这只是删除了模型,而没有删除你运行的迁移(该迁移在数据库中创建了表)。

如果你想同时删除模型和表,需要执行以下操作:

rake db:rollback 
rails d model name

但是如果我在最后一个迁移之外创建模型怎么办?我需要回滚它之后的所有迁移吗?这似乎很奇怪。 - Drakmail
我需要的是 rake db:migrate:down VERSION=20130417185845。谢谢 :) - Drakmail

4

您删除了模型-这是一种与回滚迁移不同的操作。

销毁模型只会执行此操作,与迁移无关。


我需要为删除表创建单独的迁移吗? - Drakmail
@DRakmail,为什么它不在你的原始文件中呢? - Dave Newton
因为使用 rails d model ModelName 命令删除了原始模型 :)但是你给了我一个想法。现在我看到这个工作流程:
  1. 创建模型
  2. 迁移
  3. 运行 rake db:migrate:down VERSION=20130417185845,其中 20130417185845 是迁移版本
  4. 删除模型 (rails d model ModelName)
  5. 现在我可以再次创建同名模型
这种方式正确吗?
- Drakmail

0

根据您的迁移错误,迁移文件中一定有问题,特别是涉及创建名称表的文件。

请查看此文件中的更改方法。

迁移文件中的更改方法应该执行DB代码,该DB代码可以对DB执行一些操作,并且在更改上的相同代码应该正确执行回滚操作。

如果您想区分这两个操作,应将代码放在up方法中,该方法将在DB上执行操作,在down方法中执行相反的回滚操作。

我建议您删除迁移中的所有文件,包括引起问题的文件,并编写正确的文件。

如果需要帮助,请发布您的迁移文件。

还请参阅指南:http://guides.rubyonrails.org/migrations.html


我不编辑任何迁移 - 你可以尝试执行以下命令:rails g model name name rake db:migrate rails d model name rake db:migrate rails g model name test rake db:migrate看看我的结果。 - Drakmail

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接