当我交换值时,如何在范围内验证唯一性?

时间:2015-12-17 16:50:34

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

我有这个名为LocationRule的模型。 LocationRule has_many:rule_parts和accepts_nested_attributes_for:rule_parts。

RulePart有一个名为position的属性。我用这种方式验证了这个位置:

validates_uniqueness_of :position, scope: :location_rule_id, if: -> (record) { record.location_rule_id = record.location_rule.id if record.location_rule.present?; true }

有一个问题。当我尝试在规则部分中交换位置值时,我在两个规则部分上都会出错:

Position has already been taken

我试图解决问题,试图在验证后删除错误,但在保存之前。在验证阶段有更好的方法吗?

更新1

我决定在位置规则验证器中验证规则部分的重复。但我想知道是否有更好的方法。

validate :check_uniqueness_of_rule_part_positions

def check_uniqueness_of_rule_part_positions
  positions = []
  errors = false
  self.rule_parts.each do |rp|
    if positions.include? rp.position
      rp.errors.add(:position, 'is already taken')
      errors = true
    else
      positions << rp.position
    end
  end

  self.errors.add(:priority_numbers, 'Duplication detected') if errors
end

0 个答案:

没有答案