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

Evo*_*lve 21 ruby-on-rails dbmigrate schema.rb

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

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

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

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

uta*_*ngo 38

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

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

  • 如果您已经发布(或提交,这取决于工作流)现有迁移,则应创建新迁移而不是编辑现有迁移.另一方面,如果您已经应用了新创建的迁移,并且了解到您之后错过了某些内容,则应该回滚并编辑迁移,以避免太多无用的迁移. (3认同)

jlu*_*ert 5

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

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

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


sar*_*hdi 5

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

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
Run Code Online (Sandbox Code Playgroud)

我变了

  t.text :body
Run Code Online (Sandbox Code Playgroud)

t.text :comment_body
Run Code Online (Sandbox Code Playgroud)

我试着做耙子

db:migrate
Run Code Online (Sandbox Code Playgroud)

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

db:migrate:redo
Run Code Online (Sandbox Code Playgroud)

输出

== 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) ==========================
Run Code Online (Sandbox Code Playgroud)

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

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