range_overlapping_validator.rb
1.1 KB
class RangeOverlappingValidator < ActiveModel::Validator
def validate(record)
record.class.ranges_of(record.metric_configuration_id).each do |mezuro_range|
if mezuro_range.id != record.id && overlaps?(mezuro_range,record)
record.errors[:beginning] << "There is already a #{record.class} within these boundaries! Please, choose another interval."
break
end
end
end
private
def overlaps?(range1, range2)
return true if to_float(range1.beginning) >= to_float(range2.beginning) && to_float(range1.beginning) < to_float(range2.end)
return true if to_float(range1.end) > to_float(range2.beginning) && to_float(range1.end) <= to_float(range2.end)
return true if to_float(range1.beginning) >= to_float(range2.beginning) && to_float(range1.end) <= to_float(range2.end)
return true if to_float(range1.beginning) <= to_float(range2.beginning) && to_float(range1.end) >= to_float(range2.end)
return false
end
def to_float(value)
return 1.0/0 if value=="INF"
return -1.0/0 if value=="-INF"
return value.to_f if value.is_a?(String)
return value
end
end