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

时间:2011-08-28 22:45:20

标签: ruby-on-rails ruby-on-rails-3 migration

这是我的故事:我刚才有类似的东西。

  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 个答案:

答案 0 :(得分: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

然后,当您运行此迁移时,它会将此total_votes字段添加到users表中,该表将为所有User个对象创建相同名称的属性。

答案 1 :(得分:2)

您是否在迁移完成后添加此内容?那么,users表存在并且您想要向其添加列?如果是这样,您需要创建像

这样的迁移
rails generate migration add_total_votes_to_users 

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

答案 2 :(得分:1)

如果您的应用正在投放,那么您应该创建一个新的迁移。如果您的应用程序处于预生产阶段,并且您有一个小型开发团队,并且有良好的沟通,那么我建议您继续修改迁移然后再进行

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

然后您可以提交修改后的迁移文件,并让其他人知道您已更改迁移文件