如何在Rails 3中向迁移添加新属性?

3
这是我的故事:我一段时间以前就设置好了类似这样的东西。
  create_table(:users) do |t|
  t.database_authenticatable :null => false
  t.recoverable
  t.rememberable
  t.trackable

  t.integer :total_pageviews

“total_pageviews”正常工作。我可以将其设置为零,递增,乘以,调用它,或者做任何操作。但是假设我想添加:

  t.integer :total_votes

我该如何将total_votes配置为属性?每次我尝试使用“total_votes”时,都会出现未定义方法错误。我认为答案可能是像rake db:migrate这样的命令。

3个回答

8
您不应该修改现有的迁移。如果您已将它们检入版本控制系统并且其他人运行了它们,然后您添加了一个新字段并提交了该更改,他们将不知道如何获取该更改。那么您必须告诉他们,并且修复起来很麻烦。
如果您还没有提交,则回滚迁移(rake db:rollback),进行必要的修改,然后再次运行它(rake db:migrate)。
但在实际情况下,您将创建一个新的迁移,使用rails g migration add_total_votes_to_users total_votes:integer添加此字段。
Rails将解释此迁移名称并知道如何处理它,生成包含此行的迁移:
add_column :users, :total_votes, :integer

然后当您运行此迁移时,它将向 users 表中添加此 total_votes 字段,这将使得所有 User 对象都拥有相同名称的属性。


谢谢,回想现在我发现我在这里有一堆add_(attribute)to(table)迁移。但有时候,当我编辑创建迁移文件时,它可以工作。这是怎么回事?你知道答案吗?谢谢。 - Jon
1
仅供未来访问者参考:如果您在运行迁移文件之前编辑了它,则它仍然可以运行。否则,您将需要回滚,然后再次进行迁移。 - Ryan Bigg

2

您是在迁移完成后添加这个吗?所以,用户表已经存在并且您想要向其添加一个列?如果是这样的话,您需要创建一个像以下代码一样的迁移:

rails generate migration add_total_votes_to_users 

打开它(只是为了验证表格和列是否正确)。然后运行迁移。


1

如果您的应用程序已经在生产环境中运行,那么您应该创建一个新的迁移。如果您的应用程序处于预生产阶段,并且您有一个小型的开发团队并且具有良好的沟通能力,那么我建议您继续修改迁移并执行。

rake db:drop
rake db:create
rake db:migrate

然后您可以提交修改后的迁移文件,并让团队其他成员知道您已更改了迁移文件


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接