Rails: использование метода find для доступа к объединенным таблицам для полиморфных отношений - PullRequest
0 голосов
/ 26 мая 2010

Хорошо, у меня есть общая модель 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, чтобы эти условия работали?

1 Ответ

1 голос
/ 26 мая 2010

Вы можете использовать параметр: joins при поиске, похожий на этот:

 blocks = AppointmentBlock.find(:first,
          :conditions => ['employee_id = ? and (time_slots.start_at between ? and ? or time_slots.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],
          :joins => 'join time_slots on time_slots.time_slot_role_id = appointment_blocks.id')
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...