gem pour les applications Rails pour générer des identifiants de chaîne avec un préfixe, suivi d'un nanooïde. similaire aux identifiants que vous voyez dans l'API de Stripe. également capable de rechercher n'importe quel enregistrement par identifiant, similaire au globalid de Rails. il y a un article de blog d'introduction expliquant pourquoi j'ai fait cela.
class User < ActiveRecord::Base include CoolId::Model cool_id prefix: "usr"endUser.create!(name: "...").id# => "usr_vktd1b5v84lr"
CoolId.locate("usr_vktd1b5v84lr")# => #<ID utilisateur : "usr_vktd1b5v84lr", nom : "John Doe">
par exemple pour les insertions par lots ou les upserts
User.generate_cool_id# => "usr_vktd1b5v84lr"
parsed = CoolId.parse("usr_vktd1b5v84lr")# => #<struct CoolId::Id key="vktd1b5v84lr", prefix="usr", id="usr_vktd1b5v84lr", model_class=User>parsed.model_class# => Utilisateur
il faut des paramètres pour changer l'alphabet ou la longueur
class Customer < ActiveRecord::Base include CoolId::Model cool_id préfixe : "cus", alphabet : "ABCDEFGHIJKLMNOPQRSTUVWXYZ", longueur : 8endCustomer.create!(name: "...").id# => "cus_UHNYBINU"
et ceux-ci peuvent être configurés globalement
CoolId.configure faire |config| config.separator = "-" config.alphabet = "ABCDEFGHIJKLMNOPQRSTUVWXYZ" config.length = 8end
vous pouvez utiliser cool_id avec un champ séparé, en conservant la clé primaire par défaut :
class Product < ActiveRecord::Base include CoolId::Model cool_id prefix: "prd", id_field: :public_idendproduct = Product.create!(name: "Cool Product")product.id # => 1 (ou un uuid ou tout autre élément principal clé que vous aimez)product.public_id # => "prd_vktd1b5v84lr"# localiser trouvera thisCoolId.locate("prd_vktd1b5v84lr") # => #<ID du produit : 1, public_id : "prd_vktd1b5v84lr", ...>
cette approche vous permet d'éviter d'exposer vos clés primaires, lisez Créer des clés uniques publiques de David Bryant Copeland à côté de vos clés primaires pour savoir pourquoi vous pourriez vouloir faire cela. cela permet également d'adopter cool_id plus facilement dans un projet comportant déjà des données.
ajoutez cool_id à votre Gemfile :
bundle ajouter cool_id
gemme "cool_id"
vous ne voulez pas gérer une dépendance ? copiez-le dans votre projet :
mkdir -p app/lib curl https://raw.githubusercontent.com/schpet/cool_id/main/lib/cool_id.rb -o app/lib/cool_id.rb
utiliser des identifiants de chaîne lors de la création d'une table
create_table :users, id: :string do |t| t.string : nomend
inclure le problème CoolId::Model
dans le modèle d'enregistrement actif et configurer un préfixe
class User < ActiveRecord::Base include CoolId::Model cool_id prefix: "usr"end
remarque : si vous préférez des clés primaires plus traditionnelles (comme bigints ou uuids), vous pouvez utiliser le id_field
sur une autre colonne.
tu as bu le coolaid. configurer les rails pour utiliser les identifiants de chaîne sur toutes les nouvelles migrations générées
# config/initializers/generators.rbRails.application.config.generators fait |g| g.orm :active_record, Primary_key_type : stringend
puis configurez ApplicationRecord
pour inclure un identifiant cool et assurez-vous qu'il est configuré dans les classes qui en héritent
# app/models/application_record.rbclass ApplicationRecord < ActiveRecord::Base include CoolId::Model Primary_abstract_classforce_cool_id_for_descendantsend
si vous utilisez l'interface de nœud Ruby graphql, vous pouvez implémenter l'identification d'objet
# app/graphql/app_schema.rbclass AppSchema < GraphQL::Schema def self.id_from_object(object, type_definition, query_ctx) object.id end def self.object_from_id(id, query_ctx) CoolId.locate(id) endend