testmycode/tmc-server

View on GitHub
app/models/extra_field_value.rb

Summary

Maintainability
A
0 mins
Test Coverage
# frozen_string_literal: true

# An abstract base for active record classes representing values for 'ExtraField's.
#
# See UserFieldValue for an example.
module ExtraFieldValue
  extend ActiveSupport::Concern

  included do
    validates :field_name, uniqueness: { scope: :user_id }
  end

  def field
    @field ||= ExtraField.by_kind(field_kind).find { |f| f.name == field_name }
  end

  def field_kind
    @field_kind ||= self.class.name.underscore.gsub(/_field_value$/, '').to_sym
  end

  # Unfortunately, value is actually a string that can be put directly in a form.
  # May want to refactor some day.
  def ruby_value
    case field.field_type
    when :boolean
      value.blank? || value == '0' ? false : true
    else
      value
    end
  end

  def set_from_form(new_value)
    if field.should_save?
      self.value =
        case field_kind
        when :boolean
          new_value.to_bool
        else
          new_value.to_s
        end
    end
  end
end