Rails:我更新迁移文件然后运行db:migrate,但我的架构没有更新

我正在尝试在我的一个表中添加一个额外的字段。

我在迁移文件中添加了该字段(在db \ migrate下),然后运行了’rake db:migrate’,它运行没有麻烦。 我的文本编辑器甚至告诉我我的schema.db文件已经更新,需要刷新。

模式文件不包含我的新字段,任何从我的视图引用该字段的尝试都会失败。

我该怎么做呢? 可以通过rails更新带有额外字段的表,而不必完全删除并重新创建数据库吗?

http://guides.rubyonrails.org/migrations.html#changing-existing-migrations

编写迁移时偶尔会出错。 如果您已经运行了迁移,那么您不能只编辑迁移并再次运行迁移:Rails认为它已经运行了迁移,因此在运行rake db:migrate时不会执行任何操作。 您必须回滚迁移(例如使用rake db:rollback ),编辑迁移,然后运行rake db:migrate以运行更正的版本。

在数据库中添加/更改某些内容时,应始终创建新的迁移文件。 这是迁移的目的。 迁移文件应该能够进行新的更改并撤消更改。 这样一来,如果出现问题或您改变主意,您可以轻松回滚到之前的迁移。

以下链接标记为“迁移剖析”和“编写迁移”的部分可能对您有所帮助。

http://guides.rubyonrails.org/migrations.html

解决了我自己的问题..

基本上,不是编辑运行脚手架时生成的原始迁移文件,而是创建一个新的迁移文件,仅用于您想要实现的目标:

http://guides.rubyonrails.org/migrations.html#creating-a-standalone-migration

我做了同样的事情,我想改变一个字段名称,而不是这个:

 class CreateComments < ActiveRecord::Migration def change create_table :comments do |t| t.string :commenter t.text :body # this line adds an integer column called `article_id`. t.references :article, index: true t.timestamps end end end 

我变了

  t.text :body 

 t.text :comment_body 

我试着做耙子

 db:migrate 

没有发生任何事情,因为它没有任何输出再次进入命令提示符...,我看着堆栈溢出, 这引导我做耙

 db:migrate:redo 

外出

 == 20141129044056 CreateComments: reverting =================================== -- drop_table(:comments) -> 0.0000s == 20141129044056 CreateComments: reverted (0.0886s) ========================== == 20141129044056 CreateComments: migrating =================================== -- create_table(:comments) -> 0.0040s == 20141129044056 CreateComments: migrated (0.0040s) ========================== 

然后我用commenter_body而不是body加载我的页面/控制器,它完全加载。

我认为这也是一个解决方案。 我不知道在模型/数据库的底层工作中是否有任何问题(我仍然是新的RoR,我的第三天实际上......)

通过运行rake db:schema:dump我能够通过后面的迁移重新生成我的模式

不知道这是否适用,但值得一试。 直接“ 使用Rails进行敏捷开发,第3版 ”:

有时,此schema_migrations表可能会导致问题。 例如,如果在向文件添加任何模式定义语句之前创建迁移源文件并运行db:migrate ,则数据库将认为它已更新,并且模式信息表将包含新的版本号。
如果您随后编辑该现有迁移文件并再次运行db:migrate ,则Rails将不知道应用您的新更改。 在这些情况下,通常最简单的方法是删除数据库,重新创建数据库并重新运行迁移。

一旦你做了rake db:migrate,那么你再也不能在该文件中添加列。你必须使用rails g migration add_columnname_to_tablename生成一个新的迁移文件,用于添加该特定列并执行rake db:migrate。这就是它!