No hay nada de malo en la forma estándar de tener un entero como valor para las llaves primarias en las tablas de nuestras aplicaciones. Sin embargo, por seguridad cuando los registros suelen ser públicos, lo mejor es poner dichas llave como un campo UUID. A continuación muestro como.
Normalmente, nuestra migración la hacemos como:
$ rails g model User name:string dob:date
Eso creará la tabla users con el campo id de tipo entero como llave primaria. Ahora, si queremos que sea un UUID (una cadena de 32 dígitos en el sistema hexadecimal) primero tenemos que habilitar una extensión en PostgreSQL de esta forma:
$ rails g migration enable_pgcrypto_extension
Esto va a crear una nueva migración que deberemos ejecutar. La migración luce así normalmente:
class EnablePgcryptoExtension < ActiveRecord::Migration[5.1]
def change
enable_extension 'pgcrypto' unless extension_enabled?('pgcrypto')
end
end
Con dicha extensión habilitada podremos decirle a nuestras migraciones que las llaves primarias sean de tipo UUID.
Al crear una nueva tabla:
class CreateArticles < ActiveRecord::Migration[6.0]
def change
create_table :articles, id: :uuid do |t|
t.references :author, type: :uuid, foreign_key:true
t.string :name
t.timestamps
end
end
end
o cuando se modifica o agrega una columna:
add_column :books, :user_id, :uuid
De esta forma se puede empezar a usar llaves primarias de tipo UUID para dar un toque más de seguridad a nuestros datos.
Fuentes: