2011-01-19 10 views
5

Ho un database che utilizza UUID come chiavi primarie, in questo modo:Rails: posso utilizzare riferimenti polimorfici con chiavi primarie non interi?

create_table "my_table", :id => false, :force => true do |t| 
t.string "id", :limit => 36 
end 

Tuttavia, quando cerco di usare: i riferimenti per le chiavi esterne a quel tavolo, genera colonne integer per l'ID. Can: i riferimenti devono essere istruiti per trattare un ID non intero? La mia migrazione per la tabella di riferimento è in questo modo:

create_table "child_table" :id => false, :force => true do |t| 
t.string "id", :limit => 36 
t.references :my_table 
end 

So che ho potuto solo creare manualmente :my_table_id e :my_table_type colonne, ma mi chiedo se :references può essere fatto per fare la sua magia in queste circostanze in modo che io non è necessario gestire il tipo id + esplicitamente nel mio codice.

risposta

3

No, references crea solo colonne intere al momento della stesura di questo documento.

Sono sicuro che è possibile ignorare il metodo references per fare ciò che si desidera. Ma IMO staresti meglio specificando le tue colonne UUID e digitando le colonne in modo esplicito. In questo modo il codice è chiaro su cosa sta succedendo dietro le quinte.

+0

Sì, ho appena controllato la fonte ActiveRecord e è hardcoded perché l'ID sia un numero intero. – kdt

15

A: Tipo di opzione è stato aggiunto quando si fa riferimento in quanto Rails 4,2

t.references :car, type: :uuid, index: true 

Ad esempio:

def change 
    enable_extension 'uuid-ossp' 
    create_table :cars, id: :uuid do |t| 
    t.integer :seats 
    # And other car-specific things 
    end 
    create_table :wheels do |t| 
    t.references :car, type: :uuid, index: true 
    t.integer :radius 
    # And other wheel-specific things 
    end 
end 

fonte: https://github.com/rails/rails/pull/16231