Хорошо, у меня есть общая модель TimeSlot
, которая имеет дело с start_at
и end_at
для промежутков времени. Из этого вытекает пара моделей, но я имею в виду одну в этом вопросе: AppointmentBlock
, которая является коллекцией Appointments
. Я хочу проверить AppointmentBlock
так, чтобы никакие другие AppointmentBlocks
не были запланированы для конкретного Employee
в тот же период времени. Поскольку AppointmentBlock
имеет полиморфную связь с TimeSlot
, вам необходимо получить доступ к AppointmentBlock
'start_at
и end_at
через TimeSlot
следующим образом: appt_block.time_slot.start_at
Это означает, что мне нужно иметь какое-то присоединения в моем :conditions
для моего find()
вызова метода. Вот мой код:
#inside my time_slot.rb model
belongs_to :time_slot_role, :polymorphic => true
#inside my appointment_block.rb model
has_one :time_slot, :as => :time_slot_role, :dependent => :destroy
validate :employee_not_double_booked
def employee_not_double_booked
unless self.employee_id
# this find's condition is incorrect because I need to join time_slots to get access
# to start_at and end_at. How can I do this?
blocks = AppointmentBlock.find(:first,
:conditions => ['employee_id = ? and (start_at between ? and ? or end_at between ? and ?)',
self.employee_id, self.time_slot.start_at, self.time_slot.end_at,
self.time_slot.start_at, self.time_slot.end_at])
# pseudo code:
# collect a list of appointment blocks that end after this
# apointment block starts or start before this appointment
# block ends that are also associated with this appointment
# blocks assigned employee
# if the count is great then 0 the employee has been double
# booked.
# if a block was found that means this employee is getting
# double booked so raise an error
errors.add "AppointmentBlock",
"has already been scheduled during this time" if blocks
end
end
Поскольку AppointmentBlock
не имеет start_at
или end_at
, как я могу объединиться с таблицей time_slots
, чтобы эти условия работали?