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.