У меня есть модель с именем Person и модель с именем Contract .A Лицо has_many Контракты и Контракт принадлежит a Лицо .
A Контракт имеет start_date и end_date .Контракт считается активным , если текущая дата находится в промежутке между.
У меня есть область действия по Контракту, называемая " active ", которая возвращаетзаписи соответственно.Человек может иметь любое количество неактивных контрактов, но должен иметь только один активный контракт.
Я пытаюсь найти лучший способ добавить проверку, которая предотвращает любой из этих случаев:
- Создайте новый активный Контракт со связанным лицом, у которого уже есть активный контракт.
- Измените связанное лицо в существующем активном контракте на лицо, которое уже имеет активный контракт.
- Измените Контракт, который не активен, чтобы иметь дату start_date или end_date, которая делает его активным, когда связанное Лицо уже имеет активный Контракт.
- Создайте Лицо, с которым связано несколько активных Контрактов.
Это то, чем я сейчас занимаюсь, и похоже, что это работает:
class Contract < ApplicationRecord
belongs_to :person
validates_uniqueness_of :person_id, conditions: -> { active }
scope :active, -> { where("start_date <= ? AND end_date >= ?", Date.today, Date.today) }
end
Для меня это похоже на хак.Я не обеспокоен уникальностью, я обеспокоен размером;бывает так, что уникальность работает.Что если я хотел бы разрешить не более 2 активных контрактов?
Кроме того, ошибка проверки, которую я получаю, когда пытаюсь добавить несколько активных контрактов, говорит: «Человек уже занят», что вводит в заблуждение.Конечно, я могу добавить собственное сообщение, но это похоже на еще одно указание на то, что я делаю это неправильно.