No commit activity in last 3 years
No release in over 3 years
It's often advantageous to use integer primary keys, but it may be disadvantageous to expose the size of your database to open internet. This gem makes it easy to continue using an integer primary key internally in your code, while displaying a more obscure public primary key that does not give clues to the size of your database to your users.
2005
2006
2007
2008
2009
2010
2011
2012
2013
2014
2015
2016
2017
2018
2019
2020
2021
2022
2023
2024
 Dependencies

Development

~> 1.14
~> 5.0
~> 10.0

Runtime

 Project Readme

PublicPrimaryKey Build Status

It's often advantageous to use integer primary keys, but it may be disadvantageous to expose the size of your database to open internet. This gem makes it easy to continue using an integer primary key internally in your code, while displaying a more obscure public primary key that does not give clues to the size of your database to your users.

This project was inspired by Tom Harrison's blog post.

Installation

Add this line to your application's Gemfile:

gem 'public_primary_key'

And then execute:

$ bundle

Or install it yourself as:

$ gem install public_primary_key

Usage

For now, this gem only supports ActiveRecord.

Step 1: Choose a model that you want to use public_primary_key with

  • Add a string column to your model that will store your public_primary_key (for this example I'm assume you named the column hash_id, but you can name it whatever you like)
  • (Recommended) Add an index in the database
  • (Recommended) Check for uniqueness at the database level
  • Add the following to your model
class Post < ApplicatonRecord
  # If you're not using Rails, you'll need to add the following line to each model:
  # extend PublicPrimaryKey::ActiveRecordMixin
  public_primary_key :hash_id
end
  • (Optionally) you can set which generator is used by SecureRandom (default is urlsafe_base64)
  • (Optionally) you can set the length of the primary key string (default is 10)
  • Result: users would go to /posts/TukHuqisTm4l6A instead of /posts/1.
  • If you're migrating an existing table to use this gem, be sure to backfill the new column.
class Post < ApplicationRecord
  public_primary_key :hash_id, generator: :hex, length: 12
end

Step 2: Update your controllers

Because public_primary_key overwrites the default to_param method, you will need to update your controllers. For the example above, go to the posts_controller.rb and change the set_post private method to

def set_post
  @post = Post.find_by_hash_id(params[:id])
end

You'll also want to remove hash_id from the list of trusted parameters in the post_params method.

Development

After checking out the repo, run bin/setup to install dependencies. Then, run rake test to run the tests. You can also run bin/console for an interactive prompt that will allow you to experiment.

To install this gem onto your local machine, run bundle exec rake install. To release a new version, update the version number in version.rb, and then run bundle exec rake release, which will create a git tag for the version, push git commits and tags, and push the .gem file to rubygems.org.

Contributing

Bug reports and pull requests are welcome on GitHub at https://github.com/[USERNAME]/public_primary_key. This project is intended to be a safe, welcoming space for collaboration, and contributors are expected to adhere to the Contributor Covenant code of conduct.

License

The gem is available as open source under the terms of the MIT License.