У меня есть модель, где есть два поля, которые могут быть технически равны нулю. Имена полей :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? }
Рекомендуемое чтение:
- http://guides.rubyonrails.org/active_record_validations.html#using-a-proc-with-if-and-unless
- http://api.rubyonrails.org/classes/ActiveRecord/Validations/ClassMethods.html
Наконец, вы должны переименовать :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.