2013-03-03 86 views
0

在Rails,我的会员制模式的迁移是这样的:Postgres的表没有设置自动增量的主键

class CreateMemberships < ActiveRecord::Migration 
    def change 
    create_table :memberships do |t| 
     t.integer :user_id 
     t.integer :organization_id 
     t.integer :membership_type_id 

     t.timestamps 
    end 
    end 
end 

和我的用户模型迁移:

class CreateUsers < ActiveRecord::Migration 
    def change 
    create_table :users do |t| 
     t.string :first_name 
     t.string :last_name 
     t.string :email 

     t.timestamps 
    end 
    end 
end 

对我来说,这些看起来很漂亮几乎相同。但是,当我看着表中psql我看到这一点:

cd_dev=# \d memberships 
        Table "public.memberships" 
     Column  |   Type    | Modifiers 
--------------------+-----------------------------+----------- 
id     | integer      | not null 

cd_dev=# \d users 
             Table "public.users" 
    Column  |   Type    |      Modifiers      
---------------+-----------------------------+---------------------------------------------------- 
id   | integer      | not null default nextval('users_id_seq'::regclass) 

换句话说,memberships表的id字段不会自动被分配。在Rails控制台,当我尝试通过简单地做Membership.create(user_id: 1, organization_id: 1)创建一个新的成员失败说:

ActiveRecord::StatementInvalid: PG::Error: ERROR: null value in column "id" violates not-null constraint

我大概可以谷歌的方式来正确地做出membershipsid领域的工作,但我不要”不明白是怎么发生的。有什么我应该知道Rails/Postgres?我不记得是否使用了Rails生成器或手动输入了每个模型的迁移。

回答

1

这是不正常的。你确定你没有手动摆弄数据库吗?尝试

rake db:drop db:create db:migrate 
+0

我很高兴听到这是不正常的。我在heroku的开发和生产数据库中存在这个问题。很久以前,我在一个地方手工操作数据库,但我99%肯定我的摆弄在一张完全不同的桌子上。我会尝试在dev中创建一个新的数据库并运行迁移。 PS,我不知道你可以链耙这样的命令? – mehulkar 2013-03-03 17:52:45

+0

是的,你可以,这是一个很好的诀窍 - 你不必等待耙子每次加载rails环境,它会一次完成所有3个操作。 – mrbrdo 2013-03-03 18:33:41