0

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

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

然后我提醒自己,不使用 aword_type_name可能会更好,而使用 a 可能会更好,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)

为什么旧模型还在这里?我是否忘记撤消过去的某些事情?

编辑/更新

我已经阅读了更多内容,似乎我忘了重置数据库。所以现在我使用:

$ 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有人知道这里发生了什么吗?

4

3 回答 3

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

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

D B

  Words

 id name type

 1) Bike, noun

 2) Car, noun 

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

D B

 Words

id name type

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

我认为您应该刚刚开始该项目,因此您可以使用rake db:drop会破坏所有表的命令删除数据库。

D B

  empty

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

于 2013-08-24T14:16:10.480 回答
2

在这里,问题是您销毁了脚手架 Word 但没有恢复迁移,所以旧表已经在数据库中创建并且没有删除。

现在您再次生成了脚手架。但是他的新脚手架的迁移将无法运行,因为一个名为 words 的表已经存在:

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

如果您不害怕丢失所有数据,那么您可以运行:

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

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

或者,如果您不想丢失其他表中的数据,则另一种方式,

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

rails dbconsole
>> drop table words;
>> exit

bundle exec rake db:migrate
于 2013-08-24T14:14:12.377 回答
2

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

bundle exec rake db:migrate VERSION=0

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

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

bundle exec rake db:migrate

生成新的数据库模式。

于 2013-08-24T14:21:12.887 回答