Условная валидация Rails в модели

У меня есть приложение Rails 3.2.18, где я пытаюсь выполнить некоторую условную проверку на модели.

В модели вызова есть два поля: location_id (который является ассоциацией с списком предварительно определенных местоположений) и: location_other (это текстовое поле, в котором кто-то может вводить строку или в этом случае адрес).

То, что я хочу сделать, - это использовать валидации при создании вызова, в котором проверяется наличие: location_id или: location_other.

Я прочитал руководство по проверке Rails и немного запутался. Хотел, чтобы кто-то мог пролить свет на то, как это сделать легко с условным.

Ответ 1

Я считаю, что это то, что вы ищете:

class Call < ActiveRecord::Base
  validate :location_id_or_other

  def location_id_or_other
    if location_id.blank? && location_other.blank?
      errors.add(:location_other, 'needs to be present if location_id is not present')
    end
  end
end

location_id_or_other - это специальный метод проверки, который проверяет, пустыми ли location_id и location_other. Если они оба, то он добавляет ошибку проверки. Если присутствие location_id и location_other является исключительным или, то есть только один из двух может присутствовать, а не один, а не оба, то вы можете внести следующее изменение в блок if в методе.

if location_id.blank? == location_other.blank?
  errors.add(:location_other, "must be present if location_id isn't, but can't be present if location_id is")
end

Альтернативное решение

class Call < ActiveRecord::Base
  validates :location_id, presence: true, unless: :location_other
  validates :location_other, presence: true, unless: :location_id
end

Это решение (только) работает, если присутствие location_id и location_other является исключительным или.

Ознакомьтесь с руководством по проверке Rails для получения дополнительной информации.