Movatterモバイル変換


[0]ホーム

URL:


Skip to content
DEV Community
Log in Create account

DEV Community

Alexandre
Alexandre

Posted on

     

Usando UUID no Rails 7 com PostgreSQL

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
Enter fullscreen modeExit fullscreen mode

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
Enter fullscreen modeExit fullscreen mode

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
Enter fullscreen modeExit fullscreen mode

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
Enter fullscreen modeExit fullscreen mode

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
Enter fullscreen modeExit fullscreen mode

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
Enter fullscreen modeExit fullscreen mode

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
Enter fullscreen modeExit fullscreen mode

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>
Enter fullscreen modeExit fullscreen mode

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>
Enter fullscreen modeExit fullscreen mode

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
Enter fullscreen modeExit fullscreen mode

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...
Enter fullscreen modeExit fullscreen mode

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
Enter fullscreen modeExit fullscreen mode

Agora vamos adicionarenable_extension 'pgcrypto' nodb/migrate/enable_uuid.

# db/migrate/enable_uuidclassEnableUuid<ActiveRecord::Migration[7.0]defchangeenable_extension'pgcrypto'endend
Enter fullscreen modeExit fullscreen mode

Agora vamos mudar o id.

Crie uma migração para fazer isso.

rails g migration IdToUUID
Enter fullscreen modeExit fullscreen mode

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
Enter fullscreen modeExit fullscreen mode

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
Enter fullscreen modeExit fullscreen mode

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">
Enter fullscreen modeExit fullscreen mode

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
Enter fullscreen modeExit fullscreen mode

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)

Subscribe
pic
Create template

Templates let you quickly answer FAQs or store snippets for re-use.

Dismiss

Are you sure you want to hide this comment? It will become hidden in your post, but will still be visible via the comment'spermalink.

For further actions, you may consider blocking this person and/orreporting abuse

Um jovem que quer simplesmente facilitar a vida dele.
  • Location
    Lagarto, Sergipe, Brazil
  • Joined

More fromAlexandre

DEV Community

We're a place where coders share, stay up-to-date and grow their careers.

Log in Create account

[8]ページ先頭

©2009-2025 Movatter.jp