cool_id
1.0.0
gem 用于 Rails 应用程序生成带有前缀、后跟 nanoid 的字符串 id。类似于您在 stripe 的 api 中看到的 ids。还可以通过id查找任何记录,类似于rails的globalid。有一篇介绍性博客文章解释了我这样做的原因。
class User < ActiveRecord::Base 包括 CoolId::Model Cool_id 前缀: "usr"endUser.create!(name: "...").id# => "usr_vktd1b5v84lr"
CoolId.locate("usr_vktd1b5v84lr")# => #<用户 ID: "usr_vktd1b5v84lr", 姓名: "John Doe">
例如用于批量插入或更新插入
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# => User
它需要参数来改变字母表或长度
class Customer < ActiveRecord::Base 包括 CoolId::Model Cool_id 前缀:“cus”,字母:“ABCDEFGHIJKLMNOPQRSTUVWXYZ”,长度:8endCustomer.create!(name:“...”).id# =>“cus_UHNYBINU”
这些可以全局配置
CoolId.configure 做 |config| config.separator = "-" config.alphabet = "ABCDEFGHIJKLMNOPQRSTUVWXYZ" config.length = 8end
您可以将cool_id与单独的字段一起使用,并保留默认主键:
class Product < ActiveRecord::Base include CoolId::Model Cool_id prefix: "prd", id_field: :public_idendproduct = Product.create!(name: "Cool Product")product.id # => 1 (或 uuid 或其他主值)你喜欢的密钥)product.public_id # => "prd_vktd1b5v84lr"# 定位会找到thisCoolId.locate("prd_vktd1b5v84lr") # => #<产品 ID: 1, public_id: "prd_vktd1b5v84lr", ...>
这种方法可以让您避免暴露您的主键,请阅读 David Bryant Copeland 的《在主键旁边创建面向公众的唯一键》,了解您可能想要这样做的原因。它还允许您在已有一些数据的项目中更轻松地采用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
创建表时使用字符串 id
create_table :用户,id: :string do |t| t.string :nameend
在活动记录模型中包含CoolId::Model
关注点并设置前缀
类 User < ActiveRecord::Base 包括 CoolId::Model Cool_id 前缀:“usr”end
注意:如果您更喜欢更传统的主键(如 bigints 或 uuid),您可以在不同的列上使用id_field
。
你喝了凉水。设置 Rails 在所有新生成的迁移中使用字符串 ID
# config/initializers/generators.rbRails.application.config.generators do |g| g.orm:active_record,primary_key_type::stringend
然后设置ApplicationRecord
以包含很酷的 id 并确保它在继承它的类中设置
# app/models/application_record.rbclass ApplicationRecord < ActiveRecord::Base 包括 CoolId::Model Primary_abstract_classforce_cool_id_for_descendantsend
如果使用graphql ruby节点接口,可以实现对象识别
# 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