验证rails中是否存在多个属性之一

ric*_*pai 22 ruby ruby-on-rails

在多语言应用程序中,用户可以输入他们的中文和英文名称.用户可以输入其中一个或两个,但必须至少输入一个名称.

class Person < ActiveRecord::Base
  validates :zh_name, :presence => true
  validates :en_name, :presence => true
  validates :fr_name, :presence => true
end
Run Code Online (Sandbox Code Playgroud)

由于内置:validates_presence_of方法只能同时验证两个属性,有没有办法验证rails中至少有一个属性的存在?

像一个神奇的, validates_one_of :zh_name, :en_name, :fr_name

先感谢您,

Max*_*ams 34

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      
Run Code Online (Sandbox Code Playgroud)

  • 什么是阵列上的`blank`方法?它似乎不存在.你的意思是"空白吗?" 如果是这样,它就不能像那样使用.我宁愿做`if array.reject(&:blank?).size == 0` (3认同)

Reg*_*ieB 11

将@ 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 
Run Code Online (Sandbox Code Playgroud)