在rails中具有多行,多列的自定义验证

时间:2015-05-25 10:58:32

标签: ruby-on-rails ruby validation ruby-on-rails-4

我有一个模型"Table1",我们会有大约8个字段,例如f1..f8。我需要验证f1 of the row1f1 to f8 of the other rows中的值不存在,并且所有字段的值都相同。

为了更清楚,一列中的值不应出现在另一行的其他列中,但该值可以在同一行中相同。

如何构建此类验证?

3 个答案:

答案 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