Рельсы: проверка поля присутствует только в случае присутствия другого

У меня есть модель, где есть два поля, которые могут быть технически равны нулю. Имена полей :is_activated и :activated_at. :activated_at требуется только в том случае, если для параметра :is_activated установлено значение true. Он не должен присутствовать, если :is_activated - false. Каким образом в Rails можно установить эту проверку непосредственно в ActiveRecord?

Ответ 1

Вы можете использовать Proc в валидаторе :activated_at.

validates :activated_at, :presence, if: Proc.new { |a| a.is_activated? }

Рекомендуемое чтение:


Наконец, вы должны переименовать :is_activated просто :activated. Это считается лучшей практикой в ​​Rails. Префикс is_ используется в других языках для логических атрибутов, потому что их имена методов не поддерживают символ ?. Ruby делает, а Rails генерирует методы ___? для логических атрибутов. Из-за этого лучше просто вызвать атрибут :activated и проверить его с помощью activated?.

Ответ 2

Небулевые атрибуты.

Если вы не используете атрибут Boolean, например is_activated, и хотите убедиться, что один атрибут присутствует, когда присутствует другой, небулевой атрибут, вы можете упростить его:

validates :activated_at, presence: true, if: :activated_by?

activated_by? вернет false, когда null и true в противном случае.

Ответ 3

Вы можете сделать что-то вроде этого:

validates :activated_at, presence: true, if: :is_activated?

def is_activated?
  self.is_activated
end

Это подтвердит только :activated_at, если метод is_activated? возвращает true.