Class: MeasuredValidator

Inherits:
ActiveModel::EachValidator
  • Object
show all
Defined in:
lib/measured/rails/validations.rb

Constant Summary collapse

CHECKS =
{
  greater_than: :>,
  greater_than_or_equal_to: :>=,
  equal_to: :==,
  less_than: :<,
  less_than_or_equal_to: :<=,
}.freeze

Instance Method Summary collapse

Instance Method Details

#validate_each(record, attribute, measurable) ⇒ Object



10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
# File 'lib/measured/rails/validations.rb', line 10

def validate_each(record, attribute, measurable)
  measured_config = record.class.measured_fields[attribute]

  measured_class = measured_config[:class]
  measurable_unit = record.public_send("#{ attribute }_unit")
  measurable_value = record.public_send("#{ attribute }_value")

  return unless measurable_unit.present? || measurable_value.present?

  record.errors.add(attribute, message) if [measurable_unit.blank?, measurable_value.blank?].any?

  record.errors.add(attribute, message) unless measured_class.valid_unit?(measurable_unit)

  if options[:units]
    valid_units = [options[:units]].flatten.map{|u| measured_class.conversion.to_unit_name(u) }
    record.errors.add(attribute, message) unless valid_units.include?(measured_class.conversion.to_unit_name(measurable_unit))
  end

  options.slice(*CHECKS.keys).each do |option, value|
    record.errors.add(attribute, message) unless measurable.public_send(CHECKS[option], value_for(value, record))
  end
end