У меня есть модель, где есть два поля, которые могут быть технически равны нулю. Имена полей :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
.