6

Używam PostgreSQL 9.3, Ruby 2.0, Rails 4.0.0.Problemy z ustawianiem niestandardowego klucza podstawowego w migracji Rails 4

Po przeczytaniu liczne pytania na SO dotyczące ustalania klucza podstawowego w tabeli I generowane i dodawane następujące migracji:

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 

Dodałem też self.primary_key = "uid" do mojego modelu.

Migracja powiodła się, ale po połączeniu się z bazą danych przy użyciu pgAdmin III widzę, że kolumna uid nie jest ustawiona jako klucz podstawowy. czego mi brakuje?

Odpowiedz

17

Spójrz na this answer. Spróbuj execute "ALTER TABLE shareholders ADD PRIMARY KEY (uid);" bez określania parametru primary_key w bloku create_table.

Proponuję napisać migracji tak (więc można wycofać normalnie):

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: Istnieje naturalny sposób (found here), ale tylko z typem 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

To dokładnie to, czego brakowało mi napisać w pytaniu. Chociaż udało mi się to zrobić, chcę wiedzieć, czy istnieje sposób osiągnięcia tego w "naturalny" sposób, czyli bez wykonywania bezpośrednich kwerend sql. Niemniej jednak, skoro nie ma żadnych innych sugestii, przyjmuję to jako najlepszą odpowiedź. :) –

+0

Myślę, że znalazłem sposób naturalny. Zobacz aktualizację. – peresleguine

+0

Ale jaki jest typ klucza głównego w tym przypadku? Potrzebuję, żeby to był bigint. –

0

W moim środowisku (activerecord 3.2.19 i postgres 9.3.1),

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

tworzy klucz podstawowy pomyślnie, ale zamiast określenia ": limit => 8" kolumna "type to int4!

Przepraszamy za niekompletne informacje.

0

Stworzyłem migracje takie jak ten:

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 
Powiązane problemy