gem para aplicativos Rails para gerar ids de string com um prefixo, seguido por um nanoid. semelhante aos ids que você vê na API do stripe. também é capaz de pesquisar qualquer registro por id, semelhante ao globalid do Rails. há uma postagem introdutória no blog explicando por que fiz isso.
class User < ActiveRecord::Base include CoolId::Model cool_id prefixo: "usr"endUser.create!(nome: "...").id# => "usr_vktd1b5v84lr"
CoolId.locate("usr_vktd1b5v84lr")# => #<ID do usuário: "usr_vktd1b5v84lr", nome: "John Doe">
por exemplo, para inserções em lote ou upserts
User.generate_cool_id# => "usr_vktd1b5v84lr"
analisado = CoolId.parse("usr_vktd1b5v84lr")# => #<struct CoolId::Id key="vktd1b5v84lr", prefix="usr", id="usr_vktd1b5v84lr", model_class=User>parsed.model_class# => Usuário
são necessários parâmetros para alterar o alfabeto ou comprimento
classe Cliente < ActiveRecord::Base inclui CoolId::Model cool_id prefixo: "cus", alfabeto: "ABCDEFGHIJKLMNOPQRSTUVWXYZ", comprimento: 8endCustomer.create!(nome: "...").id# => "cus_UHNYBINU"
e estes podem ser configurados globalmente
CoolId.configure do |config| config.separator = "-" config.alphabet = "ABCDEFGHIJKLMNOPQRSTUVWXYZ" config.length = 8end
você pode usar cool_id com um campo separado, mantendo a chave primária padrão:
class Product < ActiveRecord::Base include CoolId::Model cool_id prefix: "prd", id_field: :public_idendproduct = Product.create!(name: "Cool Product")product.id # => 1 (ou um uuid ou qualquer outro primário chave que você gosta)product.public_id # => "prd_vktd1b5v84lr"# localizar encontrará thisCoolId.locate("prd_vktd1b5v84lr") # => #<ID do produto: 1, public_id: "prd_vktd1b5v84lr", ...>
essa abordagem permite que você evite a exposição de suas chaves primárias, leia o artigo Criar chaves exclusivas voltadas para o público, de David Bryant Copeland, juntamente com suas chaves primárias, para saber por que você pode querer fazer isso. também permite adotar cool_id mais facilmente em um projeto que já possui alguns dados.
adicione cool_id ao seu Gemfile:
pacote adicionar cool_id
gema "cool_id"
não quer lidar com uma dependência? copie-o para o seu projeto:
mkdir -p app/lib curl https://raw.githubusercontent.com/schpet/cool_id/main/lib/cool_id.rb -o app/lib/cool_id.rb
use IDs de string ao criar uma tabela
create_table :usuários, id: :string do |t| t.string:nameend
inclua a preocupação CoolId::Model
no modelo de registro ativo e configure um prefixo
class User < ActiveRecord::Base include CoolId::Model cool_id prefix: "usr"end
nota: se você preferir chaves primárias mais tradicionais (como bigints ou uuids), você pode usar o id_field
em uma coluna diferente.
você bebeu o coolaid. configure o Rails para usar IDs de string em todas as novas migrações geradas
# config/initializers/generators.rbRails.application.config.generators do |g| g.orm: registro_ativo, tipo_chave_primária:: stringend
em seguida, configure ApplicationRecord
para incluir o ID legal e garantir que ele esteja configurado nas classes que herdam dele
# app/models/application_record.rbclass ApplicationRecord < ActiveRecord::Base include CoolId::Model Primary_abstract_classforce_cool_id_for_descendantsend
se você usar a interface do nó Ruby do Graphql, poderá implementar a identificação de objetos
# app/graphql/app_schema.rbclass AppSchema < GraphQL::Schema def self.id_from_object(objeto, type_definition, query_ctx) object.id end def self.object_from_id(id, query_ctx) CoolId.locate(id) endend