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