6

我使用postgresql 9.3,Ruby 2.0,Rails 4.0.0。在Rails 4迁移中设置自定义主键的问题

的SO关于设置主键上表中读取许多问题之后,我产生并添加以下迁移:

class CreateShareholders < ActiveRecord::Migration 
    def change 
    create_table :shareholders, { id: false, primary_key: :uid } do |t| 
     t.integer :uid, limit: 8 
     t.string :name 
     t.integer :shares 

     t.timestamps 
    end 
    end 
end 

我还添加了self.primary_key = "uid"到我的模型。

迁移成功运行,但是当我使用pgAdmin III连接到数据库时,我发现uid列未设置为主键。我错过了什么?

回答

17

看看this answer。尝试使用execute "ALTER TABLE shareholders ADD PRIMARY KEY (uid);"而不指定create_table块中的primary_key参数。

我建议写您的迁移这样的(所以你可以正常回滚):

class CreateShareholders < ActiveRecord::Migration 
    def up 
    create_table :shareholders, id: false do |t| 
     t.integer :uid, limit: 8 
     t.string :name 
     t.integer :shares 

     t.timestamps 
    end 
    execute "ALTER TABLE shareholders ADD PRIMARY KEY (uid);" 
    end 

    def down 
    drop_table :shareholders 
    end 
end 

UPD:有自然的方式(found here),但只有INT4类型:

class CreateShareholders < ActiveRecord::Migration 
    def change 
    create_table :shareholders, id: false do |t| 
     t.primary_key :uid 
     t.string :name 
     t.integer :shares 

     t.timestamps 
    end  
    end 
end 
+0

这正是我错过了这个问题写。虽然我能够做到这一点,但我想知道是否有方法以“自然”方式实现此目的,即不执行直接的SQL查询。尽管如此,由于没有其他建议,我接受这是最好的答案。 :) –

+0

我想我找到了自然的方式。请参阅更新。 – peresleguine

+0

但是这种情况下主键的类型是什么?我需要它是bigint。 –

0

在我的环境中(activerecord 3.2.19和postgres 9.3.1),

:id => true, :primary_key => "columname" 

成功创建主键,但不是指定“:limit => 8”列的类型是int4!

create_table :m_check_pattern, :primary_key => "checkpatternid" do |t| 
    t.integer  :checkpatternid, :limit => 8, :null => false 
end 

对不完整的信息抱歉。

0

我创建迁移这样的:

class CreateShareholders < ActiveRecord::Migration 
    def change 
    create_table :shareholders, id: false do |t| 
     t.integer :uid, primary_key: true 
     t.string :name 
     t.integer :shares 

     t.timestamps 
    end  
    end 
end