2010-08-29 141 views
1

嘿,当我第一次开始一个rails项目时,模型用户就被设计和创建了。在所有的迁移部分之后,它成功地在postgres创建了表格“users”。 那么,在项目进行一些修改之后,我意识到在表格中缺少一个属性/新列。Ruby-on-rails中的迁移问题

所以我所做的就是从Postgres的删除表的用户,并在我的第一个迁移的Ruby类增加一个新的列:

class CreateUsers < ActiveRecord::Migration 
    def self.up 
    create_table :users do |t| 
     t.string :name 
     t.string :password 
     t.string :email 
     t.string :authorization_token //this is the new attribute that I insert 
     t.datetime :created_at 
     t.datetime :updated_at 

     t.timestamps 
    end 
    end 

    def self.down 
    drop_table :users 
    end 
end 

所以,当我再次运行分贝:迁移跳一个新的用户表将使用新属性authorization_token创建,但它不起作用,但没有错误。

(我知道我不应该删除表,还有另一种聪明的方式做到这一点)

回答

2

迁移正在运行一次&存储在数据库中为已使用(以在schema_migrations表看看) 。您可以尝试使用rake db:migrate:reset重新运行您的初始迁移,但最好只添加新迁移(您不希望在数据库中有数据时将其删除)如下:

authorization_token

脚本/生成迁移add_authorization_token_to_users:字符串

这将产生类似以下的东西:

class AddAuthorizationTokenToUsers < ActiveRecord::Migration 
    def self.up 
    change_table :users do |t| 
     t.string :authorization_token //this is the new attribute that I insert 
    end 
    end 

    def self.down 
    remove_column :users, :authorization_token 
    end 
end 

要了解如何添加/删除列,change_table等工作,看一看的ActiveRecord :: ConnectionAdapters :: SchemaStatements http://api.rubyonrails.orghttp://guides.rubyonrails.org/migrations.html

3

使用Rails的技巧 - 不要用SQL修改你的表。当你看到这个问题时,你应该写一个像@nruth所示的新迁移。运行rake:migrate命令对你来说工作得很好。

在这种情况下,由于您已经删除了'用户'表,因此您现在的问题是您的数据库架构与Rails认为它不同步。要解决这个问题,你可以让数据库模式大致匹配Rails认为是手动创建'用户'表,运行向下迁移,然后再向上迁移。或者,您可以通过“用户”表不再存在的事实来加快速度。 Rails将迁移信息存储在schema_info表(Rails < 2.1)或schema_migrations表(Rails> = 2.1)中。如果删除该表格,那么Rails会认为该模式不存在,并尝试运行所有向上迁移并再次为您重新创建“用户”表。

最后,随着时间的推移,您可能会累积大量的迁移项目,这些迁移项目会单独添加一列或两列,但您忘记了包含该列。如果您尚未发货或尚未投入生产,那么您可以编写一个基准表格类型的迁移。它看起来像这样:

class CreateBaselineUsers < ActiveRecord::Migration 
    def self.up 
    create_table :users, :force => true do |t| 
     t.string :name 
     ... 

这将强制删除表并重新创建它与所有你想要的属性。

+0

谢谢,我做了你说的和工作:) – mateusmaso 2010-08-30 00:53:38