6

Tôi sử dụng postgresql 9.3, Ruby 2.0, Rails 4.0.0.Sự cố khi đặt khóa chính tùy chỉnh trong di chuyển Rails 4

Sau khi đọc rất nhiều câu hỏi về SO về đặt khóa Primary trên bàn, tôi tạo ra và thêm vào sự di cư sau:

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 

Tôi cũng đã thêm self.primary_key = "uid" để mô hình của tôi.

Quá trình di chuyển chạy thành công, nhưng khi tôi kết nối với DB bằng pgAdmin III, tôi thấy cột uid không được đặt làm khóa chính. Tôi đang thiếu gì?

Trả lời

17

Hãy xem this answer. Hãy thử execute "ALTER TABLE shareholders ADD PRIMARY KEY (uid);" mà không chỉ định tham số primary_key trong khối create_table.

Tôi đề nghị để viết di cư của bạn như thế này (do đó bạn có thể rollback thường):

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: Có cách tự nhiên (found here), nhưng chỉ với kiểu 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

Đó chính xác là những gì tôi đã bỏ lỡ để viết trong câu hỏi. Trong khi tôi đã có thể làm điều này, tôi muốn biết nếu có một cách để đạt được điều này theo cách "tự nhiên", đó là không thực hiện truy vấn sql trực tiếp. Tuy nhiên, vì không có bất kỳ đề xuất nào khác, tôi chấp nhận điều này như một câu trả lời hay nhất. :) –

+0

Tôi nghĩ tôi đã tìm ra cách tự nhiên. Vui lòng xem cập nhật. – peresleguine

+0

Nhưng loại khóa chính trong trường hợp này là gì? Tôi cần nó to lớn. –

0

Trong môi trường của tôi (activerecord 3.2.19 và postgres 9.3.1),

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

tạo khóa chính thành công nhưng thay vì chỉ định ": limit => 8" loại cột là int4!

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

Xin lỗi vì thông tin không đầy đủ.

0

di cư Tôi đã tạo ra như thế này:

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