我正在尝试在我的一张表中添加一个额外的字段。
我已经在迁移文件中添加了该字段(在 db\migrate 下),然后运行“rake db:migrate”,它运行没有问题。我的文本编辑器甚至告诉我我的 schema.db 文件已更新,需要刷新。
架构文件不包含我的新字段,并且从我的视图中引用该字段的任何尝试都失败了。
我该怎么做呢?是否可以通过 rails 更新带有额外字段的表,而不必完全删除并再次重新创建数据库?
我正在尝试在我的一张表中添加一个额外的字段。
我已经在迁移文件中添加了该字段(在 db\migrate 下),然后运行“rake db:migrate”,它运行没有问题。我的文本编辑器甚至告诉我我的 schema.db 文件已更新,需要刷新。
架构文件不包含我的新字段,并且从我的视图中引用该字段的任何尝试都失败了。
我该怎么做呢?是否可以通过 rails 更新带有额外字段的表,而不必完全删除并再次重新创建数据库?
http://guides.rubyonrails.org/migrations.html#changed-existing-migrations
编写迁移时有时会出错。如果您已经运行了迁移,那么您不能只是编辑迁移并再次运行迁移:Rails 认为它已经运行了迁移,因此当您运行 rake db:migrate 时不会执行任何操作。您必须回滚迁移(例如使用
rake db:rollback
),编辑您的迁移,然后运行rake db:migrate
以运行更正的版本。
在数据库中添加/更改某些内容时,您应该始终创建一个新的迁移文件。这就是迁移的目的。迁移文件应该能够进行新的更改和撤消更改。这样,如果出现问题或您改变主意,您可以轻松回滚到之前的迁移。
以下链接中标记为“迁移剖析”和“编写迁移”的部分可能对您有所帮助。
我做了同样的事情,我想改变一个字段名,而不是这个:
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
什么也没发生,因为它再次进入命令提示符而没有任何输出...,我查看了堆栈溢出,这引导我进行 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加载了我的页面/控制器,它加载得很好。
我认为这也是相同的解决方案。我不知道模型/数据库的底层工作是否有任何问题(我对 RoR 还是很陌生,实际上是我的第三天......)
解决了我自己的问题..
基本上,与其编辑运行脚手架时生成的原始迁移文件,不如为您想要实现的目标创建一个新的迁移文件:
http://guides.rubyonrails.org/migrations.html#creating-a-standalone-migration
通过运行,我能够在以后的迁移中重新生成我的架构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。就是这样!