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=UserUser>parsed.UserdelUser_class>
它需要參數來改變字母表或長度
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 或其他主值) key you like)product.public_id # => "prd_vktd1b5v84lr"#locate 會找到 thisCoolId.locate("prd_vktd1b5v84lr") # => #<Product id: 1, public_id: "prd_vdkt1"
這種方法可以讓您避免暴露您的主鍵,請閱讀 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)