我有这个名为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
我试图解决问题,试图在验证后删除错误,但在保存之前。在验证阶段有更好的方法吗?
我决定在位置规则验证器中验证规则部分的重复。但我想知道是否有更好的方法。
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