Gem for Rails 3 and 4, that helps validate overlap
Ruby JavaScript HTML
Latest commit 056addc Jun 13, 2016 @robinbortlik committed on GitHub Merge pull request #30 from sildur/master
Add spanish translation
Failed to load latest commit information.
lib
spec allow to setup shifts, so it's possible to check wide/narrow ranges Dec 3, 2015
.gitignore
.travis.yml Extend specs to include rails 4.2 Nov 14, 2014
Gemfile Setup a travis build matrix to check different versions of ruby and r… Mar 25, 2014
Gemfile.rails30
Gemfile.rails32
Gemfile.rails40
Gemfile.rails41
Gemfile.rails42
MIT-LICENSE
README.md
Rakefile
VERSION
validates_overlap.gemspec Increase version to 0.5.2 Jul 24, 2015

README.md

Build Status

ValidatesOverlap

This project rocks and uses MIT-LICENSE.

This gem is compatible with Rails 3 and 4.

When this gem should be helpful for you?

If you are developing Rails 3 app, let say some meeting planner and you can't save records which have time overlap.

Using

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 => -1.day, :end_shift => 1.day}

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} }
    }
end

apply named scopes

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

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.