class PlainModel::MergeIncludes

Public Class Methods

new(old_values) click to toggle source
# File lib/plain_model/merge_includes.rb, line 5
def initialize(old_values)
  @old_values = old_values
end

Public Instance Methods

merge(new_values) click to toggle source
# File lib/plain_model/merge_includes.rb, line 9
def merge(new_values)
  normalized = normalize_values(new_values)
  @old_values.dup.deep_merge(normalized)
end

Private Instance Methods

normalize_values(new_values) click to toggle source

Converts includes into hash structure. In this structure key is a include name and value is a nested hash structure for this include. It allows to merge and parse includes with ease. example:

new_values => [:foo, :baz, bar: :baz, qwe: [:asd, :zxc], foo: { baz: { asd: [:qwe] } }]
normalize_values(new_values) =>
{
  foo: {
    baz: {
      asd: {
        qwe: {}
      }
    }
  },
  bar: { baz: {} },
  baz: {},
  qwe: {
    asd: {},
    zxc: {}
  }
}
# File lib/plain_model/merge_includes.rb, line 37
def normalize_values(new_values)
  new_values = Array.wrap(new_values)
  return {} if new_values.empty? || (new_values.size == 1 && new_values.first == {})

  normalized = {}
  new_values.each do |value|
    value = value.to_sym if value.is_a?(String)
    value = { value => {} } unless value.is_a?(Hash)
    value.each do |value_key, value_values|
      value_key = value_key.to_sym if value_key.is_a?(String)
      normalized[value_key] = normalized.fetch(value_key, {}).deep_merge(normalize_values(value_values))
    end
  end
  normalized
end