Валидация Custom - Сравнение двух переменных между новыми и существующими объектами (датами) Rails 5 - PullRequest
0 голосов
/ 13 февраля 2019

Мое приложение для рельсов - это приложение для проживания.

У меня есть модель stay, которая является третьей моделью в has_many: через ассоциацию между tenant и flat.Пребывание определяется checkin_date и checkout_date.Я хотел бы создать пользовательские проверки, чтобы предотвратить создание нового stay, если в flat уже есть tenant в течение определенного периода ... но я никогда не пишу пользовательскую проверку раньше, поэтому яsuper lost ...

По логике я знаю, что мне нужно сравнить checkin_date и checkout_date для "уже существующей записи" и "предполагаемой новой".Поэтому я думаю, это будет выглядеть так: (n + 1 = новая запись против n = уже существующая запись)

    > def duplicate_stay
    > 
    >  if Stay.exists?(tenant_id: current_tenant.id, studio_id:
    > current_studio.id) && 
    >             checkin_date(n+1) > checkin_date(n)  
    >             checkout_date(n+1) > checkin_date(n)
    >             checkin_date(n+1)  < checkout_date(n)
    >             checkout_date(n+1) < checkout_date(n) 
    > == false 
    >             else 
    > == true (the model can be created)  
end

Может кто-нибудь мне помочь?Я продолжаю искать, но я знаю, понимаю, как это сделать!

Ответы [ 2 ]

0 голосов
/ 13 февраля 2019

Это не проверено, но если вы добавили область в класс 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
}
0 голосов
/ 13 февраля 2019

Попробуйте использовать метод cover?.Вы можете использовать это так:

today = Date.today
in_one_week = today + 7.days
search_date = today + 3.days

(today..in_one_week).cover? search_date
=> true
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...