6

Uso postgresql 9.3, Ruby 2.0, Rails 4.0.0.Problemi nell'impostazione di una chiave primaria personalizzata in una migrazione di Rails 4

Dopo aver letto numerose domande su SO per quanto riguarda l'impostazione della chiave primaria su un tavolo, ho generato e aggiunto il seguente migrazione:

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 

Ho anche aggiunto self.primary_key = "uid" per il mio modello.

La migrazione viene eseguita correttamente, ma quando mi collego al DB utilizzando pgAdmin III vedo che la colonna uid non è impostata come chiave primaria. Cosa mi manca?

risposta

17

Dai uno sguardo allo this answer. Provare a execute "ALTER TABLE shareholders ADD PRIMARY KEY (uid);" senza specificare il parametro primary_key nel blocco create_table.

suggerisco di scrivere la migrazione come questo (così si potrebbe far ritirare normalmente):

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'è modo naturale (found here), ma solo con il tipo 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

Questo è esattamente quello che ho perso di scrivere nella questione. Mentre ero in grado di farlo, voglio sapere se c'è un modo per ottenere questo in modo "naturale", cioè senza eseguire query sql dirette. Tuttavia, poiché non ci sono altri suggerimenti, lo accetto come la migliore risposta. :) –

+0

Penso di aver trovato il modo naturale. Si prega di consultare l'aggiornamento. – peresleguine

+0

Ma qual è il tipo di chiave primaria in questo caso? Ho bisogno che sia bigint. –

0

Nel mio ambiente (activerecord 3.2.19 e postgres 9.3.1),

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

crea una chiave primaria con successo ma invece di specificare ": limit => 8" il tipo di colonna 'è int4!

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

Siamo spiacenti per le informazioni incomplete.

0

migrazioni che ho creato come questo:

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 
Problemi correlati