# Public Id ## Description Simplifies the generation and use of unique, random identifiers for ActiveRecord models. We generate a string of random (using SecureRandom) alphanumeric characters (a-z, A-Z, 0-9) along with an optional prefix that defaults to the first 3 characters of the model name. The random string has a default length of 12, providing 62 ^ 12 possible strings. On assignment to the model, if duplicate ID is detected in the database, a new random identifier is generated. ## Installation Add to Gemfile / etc gem 'public_id' ## Usage Add an additional identifier column. I called it "ident", but call it whatever you want. ```sh # Identifier column MUST be a string rails generate migration add_ident_to_users ident:string ``` Tell your activerecord object that ident is your new public identifier. ```ruby class User < ActiveRecord::Base has_public_id :ident, prefix: 'user' # Automatically defines to_param as :ident end User.new.ident # => "user-ECNrdIzvCBh8" ``` Now change your controllers to lookup the public ID instead of your database ID ```ruby class UserController < ApplicationController def show User.find_by_public_id(params[:id]) # Or User.find_by_ident(params[:id]) # Nothing fancy here end end ``` There's a few other convenience methods that you may find useful. * Initialize ID's for existing records, useful in a migration. ```ruby def change add_column :users, :ident, :string User.initialize_public_ids! end ``` * Get a new random ID for your own nefarious purposes: ``` User.new_public_id ``` ### Configuration By default, ID's have 2 components. A 3 character lowercase prefix of their originating class name and a suffix of a 14 character random, unique, base64 url safe string. The suffix and prefix are joined by a dash. You can skip the prefix alltogether: ```ruby has_public_id column_name, length: 10, prefix: false ``` or set it directly: ``` has_public_id other_column_name, length: 15, prefix: 'user_' ``` The "length" option refers to the length argument passed to SecureRandom. The actual length of the random base64 string will be about 4/3's this length. The defaults to 10, for a 14 character base64 string. # Contribute * Fork this project * Add tests * Submit a pull request This project rocks and uses MIT-LICENSE.