删除后仍然在控制台中的旧模型

时间:2013-08-24 13:55:06

标签: ruby-on-rails ruby model rake

所以我刚刚开始了一个ruby项目,我对rails非常陌生。我想在我的应用程序中创建两个模型; Words(如'自行车')和Wordtypes(如'名词')。我首先通过脚手架生成Word模型。

  $ rails g scaffold Word word_name:string word_type_name:string
  $ rake db:migrate 

然后我提醒自己,最好不要使用word_type_name并且最好使用word_type_id,这样我就可以与包含wordtype引用的另一个数据库进行通信。 。

然后我跑:

  $ rails destroy scaffold Word
  $ rake db:migrate 

我重新创造了整个事物:

  $ rails g scaffold Word word_type_id:integer word_id:integer word_name:string
  $ rake db:migrate 

我想检查一切是否正确,所以我运行rails控制台:

  $ rails console
  Loading development environment (Rails 3.2.11)
  >> Word
  => Word(id: integer, word_name: string, word_type: string, created_at: datetime, updated_at: datetime)

为什么旧款还在这里?我忘了忘记过去的事吗?

EDIT / UPDATE

我已经阅读了一点,似乎忘了重置数据库。所以现在我用:

$ rake db:reset 

缺点是现在我尝试迁移所有内容时出现此错误:

  $ rake db:migrate
  ==  CreateWords: migrating ====================================================
  -- create_table(:words)
  rake aborted!
  An error has occurred, this and all later migrations canceled:

  SQLite3::SQLException: table "words" already exists: CREATE TABLE "words" ("id" INTEGER PRIMARY KEY AUTOINCREMENT NOT NULL, "word_type_id" integer, "word_id" integer, "word_name" varchar(255), "created_at" datetime NOT NULL, "updated_at" datetime NOT NULL) /Library/Ruby/Gems/1.8/gems/sqlite3-1.3.8/lib/sqlite3/database.rb:91:in `initialize'

即使我读了一些文档(http://guides.rubyonrails.org/migrations.html#resetting-the-database),rake db:reset也应删除所有旧表。有谁知道这里发生了什么?

3 个答案:

答案 0 :(得分:2)

这里的问题是您销毁了脚手架Word但没有恢复迁移,因此旧表已经在数据库中创建并且没有丢弃。

现在你又重新生成了脚手架。但是他的新脚手架的迁移将无法运行,因为名为words的表已经存在:

您将无法使用迁移删除表单词,因为它在销毁脚手架时已被删除。

如果您不想放弃所有数据,那么您可以运行:

bundle exec rake db:drop db:create db:migrate

它将通过新的更改再次设置您的数据库。

或者如果您不想在其他表格中丢失数据,则采用其他方式,

使用项目目录中终端的数据库控制台从数据库中删除表:

rails dbconsole
>> drop table words;
>> exit

bundle exec rake db:migrate

答案 1 :(得分:2)

正常流量

rails g scaffold Word word_name:string word_type_name:string

创建控制器,视图,模型,迁移文件

rake db:migrate 

这是一个rake任务,它将运行db / migrate /中的ruby文件代码,并相应地设置数据库。在您的情况下,这会创建一个words表,其中包含word_nameword_type列。

现在,当您意识到自己在脚手架中出错时,需要先恢复数据库状态。所以,运行

 rake db:rollback

这将撤消上次迁移,在您的情况下,迁移正在创建包含列的表words。然后你可以用

完全删除所有脚手架文件
rails destroy scaffold Word

这会破坏所有文件(视图,模型,迁移)。

然后你可以继续你的新脚手架,

 $ rails g scaffold Word word_type_id:integer word_id:integer word_name:string
 $ rake db:migrate 

在你的国家

在编辑中,您使用了命令

  rake db:reset

这只会重置数据库中的值,即如果您有

之类的值

<强> DB

  Words

 id name type

 1) Bike, noun

 2) Car, noun 

rake db:reset会像这样重置数据库中的所有值

<强> DB

 Words

id name type

您实际需要的是销毁列,如果您有创建它的迁移文件,则可以轻松运行rake db:rollback寻找上次迁移,迁移文件以撤消操作。

我认为你应该刚刚启动了这个项目,所以你可以使用命令rake db:drop删除数据库,这会破坏所有表。

<强> DB

  empty

然后运行将运行所有迁移的rake db:migrate

答案 2 :(得分:2)

您可以使用以下命令回滚数据库:

bundle exec rake db:migrate VERSION=0

注意:您将丢失所有数据。

之后,更改您的迁移并运行:

bundle exec rake db:migrate

生成新的数据库架构。