UniqueNumbers is a small gem for ActiveRecord capable of generating and assigning unique numbers to your models. Example usages are generating invoice numbers or order numbers.
Add this line to your application's Gemfile:
gem 'unique_numbers'
And then execute:
$ bundle
Or install it yourself as:
$ gem install unique_numbers
If you're using rails, you can run UniqueNumbers' generator to create the necessary migration:
$ rails g unique_numbers:install
Otherwise, you have to generate the table on your own. TODO
Within your ActiveRecord models, you can add a call to has_unique_number
to mark an
attribute for automatic unique number generation. This attribute already has to exist in the
database and you should also add a database-constraint for uniqueness. A simple example:
class Order < ActiveRecord::Base
has_unique_number :number, generator: :orders, type: :random
end
This will connect a random number generator to an order's :number
field. An after_create
hook is registered. It will generate a unique random number for each new order. The generator
itself is also created in the database and is referred to by the name :orders
.
To generate random numbers, you can specify type: :random
as an option for has_unique_number
.
It will use Ruby's SecureRandom.random_number
to generate and assign numbers. If a number is
already used, it will retry with another random number. You can use the max_tries
option to
specify how often UniqueNumbers should try to regenerate a new number before raising an
exception.
Options:
format
: Format of the generated number - you can use printf-style string-formatting where %i is the generated number. Also strftime-like time/date placeholders are supported, but you have to use '#' instead of '%'. Thus, 'R#y#m#d-%03i' will result in an order number containing current date and the random number padded with zeros if necessary. Defaults to '%i'.minimum
: Minimum value the random number should have at least. Defaults to 0.maximum
: Maximum value the random number should have. Defaults to 10**8 - 1.max_tries
: Number of tries, UniqueNumbers tries to regenerate a random number, if it's already been used. Defaults to 10.scope
: Can be set to:daily
. Generated numbers will only be unique per day but not globally anymore.
Example:
has_unique_number :number, generator: :orders, type: :random, format: "%04i", maximum: 9999, scope: :daily
If you need sequential numbers, maybe due to law enforcements for invoice numbers, you can use
:sequential
as a type. Every new number will be a successor of the previous one, except if
you configure an automatic reset.
Options:
format
: Format of the generated number - you can use printf-style string-formatting where %i is the generated number. Also strftime-like time/date placeholders are supported, but you have to use '#' instead of '%'. Thus, 'R#y#m#d-%03i' will result in an order number containing current date and the random number padded with zeros if necessary. Defaults to '%i'.start_value
: The first number that will be generated. It is also the value to which UniqueNumbers' internal counters will be set upon automatic reset. Defaults to 0.reset
: Can be set to:hourly
,:daily
,:weekly
,:monthly
, or:yearly
. It specifies when the number sequence will be reset.
Example:
class Invoice
has_unique_number :number, generator: :invoices, type: :sequential, format: 'R#y#m#d-%i', start_value: 42, reset: :daily
end
- Fork it ( http://github.com//unique_numbers/fork )
- Create your feature branch (
git checkout -b my-new-feature
) - Commit your changes (
git commit -am 'Add some feature'
) - Push to the branch (
git push origin my-new-feature
) - Create new Pull Request