Esse post vai ser uma rápida instalação de uuid no rails 7.
Vamos começar criando uma nova aplicação e depois vamos tentar trocar o id padrão para uuid em um projeto existente.
Se você não sabe o que é uuid, eu recomendo essepost.
Índice
Criando um projeto
A nossa aplicação vai usar o PostgreSQL como banco de dado.
rails new uuid_rails-d=postgresql
Para ser capaz de usar uuid no postgresql, tem que ativar a extensãopgcrypto
.
Então vamos criar uma migração para isso.
rails g migration enable_uuid
Abra o arquivodb/migrate/enable_uuid.rb
e adicione oenable_extension 'pgcrypto'
, como você pode ver abaixo.
# db/migrate/enable_uuidclassEnableUuid<ActiveRecord::Migration[7.0]defchangeenable_extension'pgcrypto'endend
Uma rápida explicação sobre essepgcrypto
.
Essa extensão permite que nós sejamos capaz de usar função de criptografia e tem uma função chamadogen_random_uuid
que ele gera um uuid para gente.
Bem, agora vamos colocar o uuid como chave primária.
Definindo o uuid como chave primária
Vamos criar um generator para evitar o trabalho manual.
Crie um arquivo chamado degenerators.rb
noconfig/initializers/
e coloque o código a seguir.
# config/initializers/generators.rbRails.application.config.generatorsdo|g|g.orm:active_record,primary_key_type: :uuidend
Agora qualquer modelo criado, vai usar o uuid como chave primária.
Então vamos criar um modelo para ver que está funcionando.
Criando o nosso modelo
Vamos criar um modelo chamado de publicação com título.
rails g model Publicacao titulo
Abra o arquivodb/migrate/create_publicacaos.rb
para observar um coisa.
# db/migrate/create_publicacaos.rbclassCreatePublicacaos<ActiveRecord::Migration[7.0]defchangecreate_table:publicacaos,id: :uuiddo|t|t.string:titulot.timestampsendendend
Podemos ver que ele está passando um argumento chamado id com valor:uuid
, Então até aqui, ele fez um trabalho correto.
Agora vamos criar o banco de dados e migrar.
rails db:create db:migrate
Abra orails console
para criar uma nova publicação.
rails consoleirb(main):001:0>Publicacao.create(titulo:"Nossa primeira publicação") TRANSACTION (0.4ms) BEGIN Publicacao Create (7.0ms) INSERT INTO "publicacaos" ("titulo", "created_at", "updated_at") VALUES ($1, $2, $3) RETURNING "id" [["titulo", "Nossa primeira publicação"], ["created_at", "2022-12-06 10:43:48.903056"], ["updated_at", "2022-12-06 10:43:48.903056"]] TRANSACTION (1.3ms) COMMIT=>#<Publicacao:0x00007fe438a57340 id: "fb030e22-5d0d-47d3-a856-cc5a028da2d3", titulo: "Nossa primeira publicação", created_at: Tue, 06 Dec 2022 10:43:48.903056000 UTC +00:00, updated_at: Tue, 06 Dec 2022 10:43:48.903056000 UTC +00:00>
Podemos ver que o id está com formato de uuid, então vamos criar outro para confirmar.
irb(main):002:0>Publicacao.create(titulo:"Nossa segunda publicação") TRANSACTION (0.9ms) BEGIN Publicacao Create (0.9ms) INSERT INTO "publicacaos" ("titulo", "created_at", "updated_at") VALUES ($1, $2, $3) RETURNING "id" [["titulo", "Nossa segunda publicação"], ["created_at", "2022-12-06 10:45:00.606342"], ["updated_at", "2022-12-06 10:45:00.606342"]] TRANSACTION (4.0ms) COMMIT=>#<Publicacao:0x00007fe43a2b6490 id: "4f539d04-43d4-427a-bcc8-b3fc54f3c3db", titulo: "Nossa segunda publicação", created_at: Tue, 06 Dec 2022 10:45:00.606342000 UTC +00:00, updated_at: Tue, 06 Dec 2022 10:45:00.606342000 UTC +00:00>
De fato, está criando o id como uuid.
Com isso, acabamos aqui, mas agora vamos para aqueles que quer mudar o id padrão para uuid com um projeto existente.
Trocando id padrão para uuid em um projeto existente
Eu recomendo que você crie um backup do seu banco de dados antes de tentar aplicar isso no projeto existente.
Vamos criar um aplicação que use id padrão e depois mudarei ele.
rails new id_para_uuid_rails-d=postgresqlcdid_para_uuid_rails/rails g model Publicacao titulorails db:create db:migrate
Agora vamos criar milhares de publicação.
Vamos pararails console
.
rails consoleirb(main):001:1>1000.timesdo|i|irb(main):002:1*Publicacao.createtitulo:iirb(main):003:1>end...
Pronto nós temos mil publicações e eles estão usando id padrão, agora vamos transformar eles em uuid.
Como eu estou usando PostgreSQL como banco de dado, vamos adicionar a extensãopgcrypto
.
Para isso, vamos criar uma migração.
rails g migration enable_uuid
Agora vamos adicionarenable_extension 'pgcrypto'
nodb/migrate/enable_uuid
.
# db/migrate/enable_uuidclassEnableUuid<ActiveRecord::Migration[7.0]defchangeenable_extension'pgcrypto'endend
Agora vamos mudar o id.
Crie uma migração para fazer isso.
rails g migration IdToUUID
E adicione o código abaixo nodb/migrate/id_to_uuid
.
# db/migrate/id_to_uuidclassIdToUuid<ActiveRecord::Migration[7.0]defchangeadd_column:publicacaos,:uuid,:uuid,default:"gen_random_uuid()",null:falsechange_table:publicacaosdo|t|t.remove:idt.rename:uuid,:idendexecute"ALTER TABLE publicacaos ADD PRIMARY KEY (id);"endend
OBS: Se você está mudando em seu projeto, basta trocar a tabela publicacaos para a tabela que você está mudando, e se você quer mudar todos as tabelas, vai tem que copiar e colar, por exemplo:
# db/migrate/id_to_uuidclassIdToUuid<ActiveRecord::Migration[7.0]defchangeadd_column:publicacaos,:uuid,:uuid,default:"gen_random_uuid()",null:falseadd_column:comentarios,:uuid,:uuid,default:"gen_random_uuid()",null:falsechange_table:publicacaosdo|t|t.remove:idt.rename:uuid,:idendchange_table:comentariosdo|t|t.remove:idt.rename:uuid,:idendexecute"ALTER TABLE publicacaos ADD PRIMARY KEY (id);"execute"ALTER TABLE comentarios ADD PRIMARY KEY (id);"endend
Bem, vamos continuar.
Agora vamos migrar e rodar orails console
para ver se funcionou.
rails db:migrate...rails consoleirb(main):001:0>Publicacao.first Publicacao Load (1.6ms) SELECT "publicacaos".* FROM "publicacaos" ORDER BY "publicacaos"."id" ASC LIMIT $1 [["LIMIT", 1]]=>#<Publicacao:0x00007f7cd4d96838 titulo: "299", created_at: Tue, 06 Dec 2022 12:00:24.017099000 UTC +00:00, updated_at: Tue, 06 Dec 2022 12:00:24.017099000 UTC +00:00, id: "002b5dbd-6087-4437-959a-32c06cf96c11">
Podemos ver que o id está de fato em uuid, mas vamos ver se todos estão realmente em formato de uuid.
irb(main):002:0>Publicacao.all.all?{|p|p.id.match?/^.{8}-.{4}-.{4}-.{17}$/} Publicacao Load (4.0ms) SELECT "publicacaos".* FROM "publicacaos"=>true
Deutrue
, quer dizer que todos eles estão como uuid.
Com isso, nós acabamos aqui.
Caso tenha dado erro, comente o erro, que tentarei te ajudar.
Bem, então é isso, Tchau!
Top comments(0)
For further actions, you may consider blocking this person and/orreporting abuse