Ruby on rails Rails:我更新迁移文件,然后运行db:migrate,但我的模式不是';t更新

Ruby on rails Rails:我更新迁移文件,然后运行db:migrate,但我的模式不是';t更新,ruby-on-rails,dbmigrate,schema.rb,Ruby On Rails,Dbmigrate,Schema.rb,我正在尝试向我的一个表中添加一个额外字段 我在迁移文件中添加了该字段(在db\migrate下), 然后运行“rakedb:migrate”,运行起来没有任何问题。我的文本编辑器甚至告诉我schema.db文件已经更新,需要刷新 架构文件不包含我的新字段,任何从我的视图引用该字段的尝试都会失败 我该怎么做?可以通过rails使用额外字段更新表,而无需完全删除并重新创建数据库?不知道这是否适用,但值得一试。直接来自“Rails敏捷开发,第三版”: 有时,此schema_migrations表可能

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

我在迁移文件中添加了该字段(在db\migrate下), 然后运行“rakedb:migrate”,运行起来没有任何问题。我的文本编辑器甚至告诉我schema.db文件已经更新,需要刷新

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


我该怎么做?可以通过rails使用额外字段更新表,而无需完全删除并重新创建数据库?

不知道这是否适用,但值得一试。直接来自“Rails敏捷开发,第三版”: 有时,此schema_migrations表可能会给您带来问题。例如,如果您创建 迁移源文件并运行
db:migrate
,然后再向文件添加任何架构定义语句, 数据库将认为它已更新,schema info表将包含新版本 号码。
如果您随后编辑现有的迁移文件并再次运行
db:migrate
,Rails将不知道如何进行迁移 应用您的新更改。在这些情况下,通常最容易删除数据库,重新创建
然后重新运行迁移。

解决了我自己的问题

基本上,不是编辑运行scaffolding时生成的原始迁移文件,而是创建一个新的迁移文件,只用于您想要实现的内容:


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

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


一旦你做了rake db:migrate,那么你就不能再向该文件中添加列了。你必须使用rails g migration生成一个新的迁移文件,将列名称添加到表格名称中以添加特定的列,然后再做rake db:migrate。就是这样

在编写迁移时,有时会出错。如果已经运行了迁移,那么就不能编辑迁移并再次运行迁移:Rails认为它已经运行了迁移,因此在运行rake db:migrate时将什么也不做。必须回滚迁移(例如,使用
rake db:rollback
),编辑迁移,然后运行
rake db:migrate
,以运行正确的版本


通过运行
rakedb:schema:dump

我可以通过后面的迁移重新生成我的模式。我做了同样的事情,我想更改一个字段名和 与此相反:

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

我试着做耙子

db:migrate
没有发生任何事情,因为它再次进入命令提示符而没有任何输出…,我查看了堆栈溢出并指导我执行rake

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加载了我的页面/控制器,它加载得非常完美


我认为这也是解决问题的办法。我不知道模型/DB中的底层工作是否有任何问题(我对RoR还是很陌生,实际上是第三天…

这对我来说是一个方便的解决方案,因为我的DB更改还没有被其他人使用。但我认为,对于许多其他人来说,创建新的迁移比回滚迁移更安全,因为回滚迁移会撤消迁移对模式所做的修改。但是我是Rails新手,所以也许有经验的人可以解释什么时候使用哪个选项?如果您已经发布(或提交,这取决于工作流),那么您应该创建一个新的迁移,而不是编辑现有的迁移。另一方面,如果您应用了一个新创建的迁移,并且了解到在此之后您错过了一些东西,那么您应该回滚并编辑迁移,以避免太多无用的迁移带来的混乱。这是一个非常好的解决方案,可以执行回滚,然后快速地重新迁移。即使听起来很好,我也从未做过回退。但这是真的,这就是迁移的好处所在。。。
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) ==========================