Wykonanie walidacji sprawdzającej unikalność na dwóch modelach

Są trzy modele:
> # Table name: activities_people

#
#  activity_id :integer          not null
#  person_id   :integer          not null
#  date        :date             not null
#  id          :integer          not null, primary key
#
# Table name: activities
#
#  id          :integer          not null, primary key
#  name        :string(20)       not null
#  description :text
#  active      :boolean          not null
#  day_of_week :string(20)       not null
#  start_on    :time             not null
#  end_on      :time             not null

Trzecim modelem jest people.
Asocjacje:
class Activity < ActiveRecord::Base
has_many :activities_people
has_many :people, through: :activities_people
end

class ActivitiesPerson < ActiveRecord::Base
  belongs_to :person
  belongs_to :activity
end

class Person < ActiveRecord::Base
has_many :activities, through: :activities_people
end

Problem:
Nie wiem jak stworzyć metodę walidacyjną w activities_person.rb zabezpieczająca dołączenie osób do wielu zajęć odbywające się w tym samym terminie(data i czas start_on i end_on pokrywające się).
Przykład
person_id: 1 jest zapisany na zajęcia które będą 08.08.2016(date), w godz. 09;00(start_on) - 10:00(end_on). Jeśli ta sama osoba będzie chciała się zapisać na inne zajęcia odbywające się 08.08.2016 w godz. 09:30-10:30 wyskoczy błąd.
Co próbowałem:

def check_join_client
# check if client joined to some activities in same date as current join
activities_date = person.activities_people.where(date: date)

    if activities_date.any?
      # get start_on and end_on for current activity and date
      get_activities = person.activities.where(id: activities_date.pluck(:activity_id))
      ol_activities = get_activities.where('((start_on <= :start_on AND
                                                    end_on >= :end_on) OR
                                                   (start_on <= :start_on AND
                                                    end_on <= :end_on AND
                                                    end_on >= :start_on) OR
                                                   (start_on >= :start_on AND
                                                    start_on <= :end_on AND
                                                    end_on >= :end_on))',
                                                  start_on: get_activities.pluck(:start_on),
                                                  end_on: get_activities.pluck(:end_on))
    end
  end

Moja metoda nie jest prawidłowa. Nie mam pojęcia jak rozgryźć problem.

możesz spróbować użyć metody overlaps? http://apidock.com/rails/Range/overlaps%3F aby sprawdzić czy godziny w activity nie pokrywają się z już istniejącymi

@wafcio Dobrze, ale jak sprawdzić dla konkretnej daty? Czyli najpierw sprawdzamy czy person jest zapisany na jakiekolwiek ćwiczenia tego konkretnego dnia. Jeśli tak to sprawdza wszystkie zapisy czy pokrywają się z tym ćwiczeniem na który chcę się zapisać.

Możesz pobrać activities z danego dnia, do których przypisany jest użytkownik. Następne wykorzystujesz atrybuty start_on i end_on, które wykorzystujesz do utworzenia range i za pomocą overlaps? sprawdzasz czy się nie pokrywa.