我有一个模型"Table1"
,我们会有大约8个字段,例如f1..f8
。我需要验证f1 of the row1
中f1 to f8 of the other rows
中的值不存在,并且所有字段的值都相同。
为了更清楚,一列中的值不应出现在另一行的其他列中,但该值可以在同一行中相同。
如何构建此类验证?
答案 0 :(得分:0)
尝试以下验证。
validate :uniq_field_validation
def uniq_field_validation
field_names = [:f1, :f2, :f3]
field_names.each do |field_name|
_other_rows = self.class.all - [self]
field_values = []
field_names.each { |field| field_values << _other_rows.map { |row| row[field] } }
errors.add(field_name.to_sym, "is present in other fields") if field_values.include?(self[field_name])
end
end
答案 1 :(得分:0)
validates :attr, uniqueness: {scope: [:attr1, ... , :attrn]}
这对你有用。
答案 2 :(得分:0)
添加像这样的自定义验证
validate f1_unique?
def f1_unique?
if Table1.where("f1=:f1_val OR f2=:f1_val OR ... f8=:f1_val", f1_val: f1).exists?
errors.add(:f1, "is duplicate")
end
end