Подтвердить что ты не робот

Подтвердить наличие одного из нескольких атрибутов в рельсах

В многоязычном приложении пользователь может вводить свои китайские и английские имена. Пользователь может ввести один или оба, но должен ввести хотя бы одно имя.

class Person < ActiveRecord::Base
  validates :zh_name, :presence => true
  validates :en_name, :presence => true
  validates :fr_name, :presence => true
end

Так как метод built-in: validates_presence_of может только проверять оба атрибута сразу, существует ли способ проверить наличие хотя бы одного из многих атрибутов в рельсах?

Как волшебный, validates_one_of :zh_name, :en_name, :fr_name

Заранее спасибо,

4b9b3361

Ответ 1

validate :at_least_one_name

def at_least_one_name
  if [self.zh_name, self.en_name, self.fr_name].reject(&:blank?).size == 0
    errors[:base] << ("Please choose at least one name - any language will do.")
  end
end      

Ответ 2

Принимая @micapam, ответьте на шаг дальше, могу ли я предложить:

validate :has_a_name

def has_a_name
  unless [zh_name?, en_name?, fr_name?].include?(true)
    errors.add :base, 'You need at least one name in some language!'
  end
end 

Ответ 3

просто быстрый выстрел, вы можете передать "if" или "if" на валидатор, возможно, вы можете заставить его работать таким образом. я имею в виду что-то подобное

validates :zh_name, :presence => { :if => (fr_name.blank? && en_name.blank?) }

Ответ 4

validate :has_a_name

def has_a_name
  unless [zh_name, en_name, fr_name].any?{|val| val.present? }
    errors.add :base, 'You need at least one name in some language!'
  end
end 

Ответ Макс Уильямс в порядке, но я не видел необходимости считать хиты когда-нибудь? возвращает логическое значение.