gem для приложений Rails для генерации идентификаторов строк с префиксом, за которым следует наноид. похоже на идентификаторы, которые вы видите в API полосы. также может искать любую запись по идентификатору, аналогично глобальному идентификатору рельсов. есть вводная запись в блоге, объясняющая, почему я это сделал.
class User < ActiveRecord::Base включает CoolId::Model префикс cool_id: "usr"endUser.create!(name: "...").id# => "usr_vktd1b5v84lr"
CoolId.locate("usr_vktd1b5v84lr")# => #<Идентификатор пользователя: "usr_vktd1b5v84lr", name: "Джон Доу">
например, для пакетных вставок или повышений
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# => Пользователь
для изменения алфавита или длины требуются параметры
class Customer < ActiveRecord::Base включает CoolId::Model префикс cool_id: "cus", алфавит: "ABCDEFGHIJKLMNOPQRSTUVWXYZ", длина: 8endCustomer.create!(name: "...").id# => "cus_UHNYBINU"
и их можно настроить глобально
CoolId.configure do |config| config.separator = "-" config.alphabet = "ABCDEFGHIJKLMNOPQRSTUVWXYZ" config.length = 8end
вы можете использовать Cool_id с отдельным полем, сохраняя первичный ключ по умолчанию:
class Product < ActiveRecord::Base включает CoolId::Model префикс cool_id: "prd", id_field: :public_idendproduct = Product.create!(name: "Cool Product")product.id # => 1 (или uuid или любой другой основной ключ, который вам нравится)product.public_id # => "prd_vktd1b5v84lr"#locate найдет thisCoolId.locate("prd_vktd1b5v84lr") # => #<Идентификатор продукта: 1, public_id: "prd_vktd1b5v84lr", ...>
этот подход позволяет вам избежать раскрытия ваших первичных ключей. Прочитайте статью Дэвида Брайанта Коупленда «Создавайте общедоступные уникальные ключи вместе с первичными ключами», чтобы узнать, почему вы можете захотеть это сделать. это также позволяет вам легче использовать Cool_id в проекте, в котором уже есть некоторые данные.
добавьте Cool_id в ваш Gemfile:
пакет добавить Cool_id
драгоценный камень "cool_id"
не хотите иметь дело с зависимостью? скопируйте его в свой проект:
mkdir -p app/lib curl https://raw.githubusercontent.com/schpet/cool_id/main/lib/cool_id.rb -o app/lib/cool_id.rb
использовать идентификаторы строк при создании таблицы
create_table :users, id: :string do |t| t.string :конец имени
включите CoolId::Model
в модель активной записи и установите префикс
class User < ActiveRecord::Base включает CoolId::Model префикс Cool_id: "usr"end
Примечание: если вы предпочитаете более традиционные первичные ключи (например, bigints или uuids), вы можете использовать id_field
в другом столбце.
ты выпил охлаждающую жидкость. настроить рельсы для использования идентификаторов строк во всех новых сгенерированных миграциях
# config/initializers/generators.rbRails.application.config.generators do |g| g.orm :active_record, Primary_key_type: :stringend
затем настройте ApplicationRecord
, чтобы включить классный идентификатор, и убедитесь, что он настроен в классах, которые наследуются от него.
# app/models/application_record.rbclass ApplicationRecord < ActiveRecord::Base include CoolId::Model Primary_abstract_class Enforce_cool_id_for_descendantsend
если вы используете интерфейс узла Ruby Graphql, вы можете реализовать идентификацию объекта
# 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