ActiveRecord::Validations模块中有一个validatesuniquenessof类宏,它可以验证多个字段,但它只是单独验证这些字段。不能联合验证,要联合验证,可以提供一个继承自ActiveModel::Validator类,实现validate方法,例如:
class UniqueueValidator < ActiveModel::Validator def validate(record) exists = Node.where(app_name: record.app_name, con_name: record.con_name, act_name: record.act_name).first validate = false if exists.nil? validate = true else if record.new_record? record.errors[:base] = "app_name, con_name, act_name联合验证unique失败,new_record" validate = false elsif record.id == exists.id validate = true else validate = false record.errors[:base] = "app_name, con_name, act_name联合验证unique失败,已存在" end end return validate end end
这里验证 :appname, :conname, :actname这3个字段。然后在需要验证的类里使用validateswith UniqueueValidator来验证。
需要注意的是,如果验证失败,只返回false是不够的,必须设置errors这个hash中的错误消息,否则Rails会当作验证成功的。