pupilfirst/pupilfirst

View on GitHub
lib/stringify_ids.rb

Summary

Maintainability
A
1 hr
Test Coverage
A
100%
module StringifyIds
  def stringify_ids(hash)
    hash.keys.each_with_object({}) do |key, result|
      string_key = key.to_s
      original_value = hash[key]

      result[key] = if original_value.is_a?(Array)
        stringify_ids_in_array(string_key, original_value)
      elsif original_value.respond_to?(:key?)
        stringify_ids(original_value)
      elsif (string_key == 'id' || string_key.ends_with?('_id')) && original_value.is_a?(Numeric)
        original_value.to_s
      else
        original_value
      end
    end
  end

  private

  def stringify_ids_in_array(key, array)
    if key.ends_with?('_ids')
      array.map(&:to_s)
    else
      array.map do |element|
        if element.respond_to?(:key?)
          stringify_ids(element)
        else
          element
        end
      end
    end
  end
end