Это не проверено, но если вы добавили область в класс Stay
:
scope :overlaps, ->(stay) {
where(
tenant_id: stay.tenant_id,
studio_id: stay.studio_id,
).
where(arel_table[:checkin_date].lt(stay.checkout_date)).
where(arel_table[:checkout_date].gt(stay.checkin_date))
}
... тогда для экземпляра Stay
@stay
вызов Stay.overlaps(@stay).exists?
вернетсяtrue, если был какой-либо экземпляр, перекрывающийся с @ stay.
Дайте мне знать, если это не сработает.Часто полезно посмотреть на SQL, который выполняется как часть проверки, если вы не уверены, почему что-то работает не так, как вы думаете.
Редактировать: одна сложная вещь здесь заключается в том, чтооставаться перекрывающимся с самим собой, поэтому, если @stay
был успешно сохранен (т. е. ему назначено id
), у вас могут возникнуть проблемы с этой логикой.Вы можете предоставить различную логику в зависимости от того, сохранена запись или нет.
Я думаю, что это сделает это:
scope :overlaps, ->(stay) {
logic = where(
tenant_id: stay.tenant_id,
studio_id: stay.studio_id,
).
where(arel_table[:checkin_date].lt(stay.checkout_date)).
where(arel_table[:checkout_date].gt(stay.checkin_date))
logic = logic.where.not(id: stay.id) unless stay.new_record?
logic
}