Skip to content

jbox-web/auto_increment

Repository files navigation

AutoIncrement

GitHub license GitHub release CI Code Climate Test Coverage

AutoIncrement provides automatic incrementation for a integer or string fields in Rails.

Installation

Put this in your Gemfile :

git_source(:github){ |repo_name| "https://github.com/#{repo_name}.git" }

gem 'auto_increment', github: 'jbox-web/auto_increment', tag: '1.8.0'

then run bundle install.

Usage

To work with a auto increment column you used to do something like this in your model:

  before_create :set_code
  def set_code
    max_code = Operation.maximum(:code)
    self.code = max_code.to_i + 1
  end

Looks fine, but not when you need to do it over and over again. In fact auto_increment does it under the cover.

All you need to do is this:

class Project < ApplicationRecord
  auto_increment :code
end

And your code field will be incremented :)

Customizing

So you have a different column or need a scope. auto_increment provides options. You can use it like this:

class Project < ApplicationRecord
  auto_increment :letter, scope: [:account_id, :job_id], model_scope: :in_account, initial: 'C', force: true, lock: false, before: :create
end

First argument is the column that will be incremented. Can be integer or string.

  • scope: you can define columns that will be scoped and you can use as many as you want (default: nil)
  • model_scope: you can define model scopes that will be executed and you can use as many as you want (default: nil)
  • initial: initial value of column (default: 1)
  • force: you can set a value before create and auto_increment will not change that, but if you do want this, set force to true (default: false)
  • lock: wraps the max query in SELECT ... FOR UPDATE (within the save transaction) to serialize concurrent increments. (default: false)
  • before: you can choose a different callback to be used (:create, :save, :validation) (default: create). Note that :save also runs on updates.

Concurrency

The value is computed by reading the current maximum and adding one, so two concurrent inserts can still race. lock: true mitigates this on databases that support row locking, but for a hard guarantee add a unique database index on the incremented column (scoped columns included) as a backstop — the gem does not create one for you.

About

Automatically increment an integer or string field on an ActiveRecord model via a Rails callback

Topics

Resources

Stars

Watchers

Forks

Releases

Packages

Used by

Contributors

Languages