Gem for Rails 3 and 4, that helps validate overlap
Ruby JavaScript HTML
Latest commit bb9a45f Jan 2, 2017 @robinbortlik committed on GitHub Merge pull request #39 from robinbortlik/release-0-8-1
Increase version to 0.8.1
Failed to load latest commit information.
lib Add compatibility check for rails version < 4.1 Jan 2, 2017
.gitignore Add database cleaner and robocop Dec 10, 2016
.rubocop.yml Add database cleaner and robocop Dec 10, 2016
Gemfile.rails32 Setup a travis build matrix to check different versions of ruby and r… Mar 25, 2014
Gemfile.rails40 Setup a travis build matrix to check different versions of ruby and r… Mar 25, 2014
Gemfile.rails42 Extend specs to include rails 4.2 Nov 14, 2014
validates_overlap.gemspec Build for rails 5 Dec 11, 2016

Build Status


This project rocks and uses MIT-LICENSE.

This gem is compatible with Rails 3, 4, 5.

When this gem should be helpful for you?

Ideal solution for booking applications where you want to make sure, that one place can be booked only once in specific time period.


Add to your gemfile

gem 'validates_overlap'

In your model

without scope

validates :starts_at, :ends_at, :overlap => true

with scope

validates :starts_at, :ends_at, :overlap => {:scope => "user_id"}

exclude edges

validates :starts_at, :ends_at, :overlap => {:exclude_edges => "starts_at"}
validates :starts_at, :ends_at, :overlap => {:exclude_edges => ["starts_at", "ends_at"]}

shift edges

validates :starts_at, :ends_at, :overlap => {:start_shift =>, :end_shift =>}

define custom validation key and message

validates :starts_at, :ends_at, :overlap => {:message_title => "Some validation title", :message_content => "Some validation message"}

with complicated relations

Example describes valildatation of user, positions and time slots. User can't be assigned 2 times on position which is under time slot with time overlap.

class Position < ActiveRecord::Base
  belongs_to :time_slot
  belongs_to :user
  validates "time_slots.starts_at", "time_slots.ends_at",
    :overlap => {
      :query_options => {:includes => :time_slot},
      :scope => { "positions.user_id" => proc{|position| position.user_id} }

apply named scopes

class ActiveMeeting < ActiveRecord::Base
  validates :starts_at, :ends_at, :overlap => {:query_options => {:active => nil}}
  scope :active, where(:is_active => true)

Overlapped records

If you need to know what records are in conflict, pass the {load_overlapped: true } as validator option and validator will set instance variable @overlapped_records to the validated object.

class ActiveMeeting < ActiveRecord::Base
  validates :starts_at, :ends_at, :overlap => {:load_overlapped => true}

  def overlapped_records
    @overlapped_records || []

Rails 4.1 update

If you just upgraded your application to rails 4.1 you can discover some issue with custom scopes. In older versions we suggest to use definition like

  {:overlap => {:query_options => {:active => true}}}

but this code is not longer working. Currently please change your code to

  {:overlap => {:query_options => {:active => nil}}}

Thanks @supertinou for discovering and fix of this bug.