Module: JSONAPI::Serialization::ModelAttributesTransformation

Included in:
Deserializer
Defined in:
lib/json_api/serialization/concerns/model_attributes_transformation.rb

Instance Method Summary collapse

Instance Method Details

#apply_virtual_attribute_transformers(attrs) ⇒ Object



13
14
15
16
17
18
# File 'lib/json_api/serialization/concerns/model_attributes_transformation.rb', line 13

def apply_virtual_attribute_transformers(attrs)
  transformed_params, attributes_with_setters = invoke_setter_methods(attrs)
  attributes_with_setters.each { |attr_sym| attrs.delete(attr_sym) }
  merge_transformed_params(attrs, transformed_params)
  attrs
end

#call_setters(attrs, definition_instance) ⇒ Object



53
54
55
56
57
58
59
60
61
62
# File 'lib/json_api/serialization/concerns/model_attributes_transformation.rb', line 53

def call_setters(attrs, definition_instance)
  attributes_with_setters = []
  attrs.each do |attr_sym, attr_value|
    next unless has_setter?(definition_instance, attr_sym)

    definition_instance.public_send(:"#{attr_sym}=", attr_value)
    attributes_with_setters << attr_sym
  end
  attributes_with_setters
end

#create_definition_instance_for_settersObject



49
50
51
# File 'lib/json_api/serialization/concerns/model_attributes_transformation.rb', line 49

def create_definition_instance_for_setters
  @definition.new(nil, {})
end

#has_setter?(definition_instance, attr_sym) ⇒ Boolean

Returns:

  • (Boolean)


64
65
66
# File 'lib/json_api/serialization/concerns/model_attributes_transformation.rb', line 64

def has_setter?(definition_instance, attr_sym)
  definition_instance.respond_to?(:"#{attr_sym}=", false)
end

#invoke_setter_methods(attrs) ⇒ Object



41
42
43
44
45
46
47
# File 'lib/json_api/serialization/concerns/model_attributes_transformation.rb', line 41

def invoke_setter_methods(attrs)
  definition_instance = create_definition_instance_for_setters
  return [{}, []] unless definition_instance.respond_to?(:transformed_params, true)

  attributes_with_setters = call_setters(attrs, definition_instance)
  [definition_instance.transformed_params, attributes_with_setters]
end

#merge_transformed_params(attrs, transformed_params) ⇒ Object



20
21
22
23
24
25
26
# File 'lib/json_api/serialization/concerns/model_attributes_transformation.rb', line 20

def merge_transformed_params(attrs, transformed_params)
  return attrs unless transformed_params.is_a?(Hash) && transformed_params.any?

  transformed_params_symbolized = transformed_params.transform_keys(&:to_sym)
  attrs.merge!(transformed_params_symbolized)
  attrs
end

#process_relationships(attrs) ⇒ Object



28
29
30
31
32
33
34
35
36
37
38
39
# File 'lib/json_api/serialization/concerns/model_attributes_transformation.rb', line 28

def process_relationships(attrs)
  permitted_relationships = @definition.relationship_names.map(&:to_s)

  relationships.each do |key, value|
    association_name = key.to_s
    next unless permitted_relationships.include?(association_name)

    process_relationship(attrs, association_name, value)
  end

  attrs
end

#to_model_attributesObject



6
7
8
9
10
11
# File 'lib/json_api/serialization/concerns/model_attributes_transformation.rb', line 6

def to_model_attributes
  attrs = attributes.dup
  attrs = apply_virtual_attribute_transformers(attrs)
  attrs = process_relationships(attrs)
  attrs.transform_keys(&:to_s)
end