Class: ImpExp::Serializers::RelationOneToMany

Inherits:
Object
  • Object
show all
Defined in:
app/services/imp_exp/serializers/relation_one_to_many.rb

Constant Summary collapse

SEPARATOR =
','

Instance Attribute Summary collapse

Instance Method Summary collapse

Constructor Details

#initialize(*columns, class_name: nil) ⇒ RelationOneToMany

Returns a new instance of RelationOneToMany.



10
11
12
13
# File 'app/services/imp_exp/serializers/relation_one_to_many.rb', line 10

def initialize(*columns, class_name: nil)
  @columns = columns
  @class_name = class_name
end

Instance Attribute Details

#class_nameObject (readonly)

Returns the value of attribute class_name.



8
9
10
# File 'app/services/imp_exp/serializers/relation_one_to_many.rb', line 8

def class_name
  @class_name
end

#columnsObject (readonly)

Returns the value of attribute columns.



8
9
10
# File 'app/services/imp_exp/serializers/relation_one_to_many.rb', line 8

def columns
  @columns
end

Instance Method Details

#dump(record, relation_name) ⇒ Object



15
16
17
18
19
20
21
22
23
# File 'app/services/imp_exp/serializers/relation_one_to_many.rb', line 15

def dump(record, relation_name)
  records = record.send(relation_name)
  records.map do |r|
    columns.map do |column|
      r.send(column)
    end.join(COMPOSITE_IDENTIFIER_SEPARATOR)
  end
  .join(SEPARATOR)
end

#load(data, model:, relation_name:, scoping_parent:) ⇒ Object



25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
# File 'app/services/imp_exp/serializers/relation_one_to_many.rb', line 25

def load(data, model:, relation_name:, scoping_parent:)
  values_array = data.to_s.split(SEPARATOR).map do |chunk|
    chunk.strip.split(COMPOSITE_IDENTIFIER_SEPARATOR).map(&:strip)
  end

  relation_class = class_name || relation_class_from_reflection(model, relation_name)
  relation_class = relation_class.to_s.constantize

  if values_array.empty?
    records = relation_class.none
  else
    records = relation_class.where(columns.zip(values_array[0]).to_h)
  end

  values_array.uniq!

  values_array[1..]&.each do |values|
    records = records.or(relation_class.where(columns.zip(values).to_h))
  end

  records = Utils::RelationScoper.call(records, relation_class, scoping_parent)

  values_array.map do |values|
    record = records.find { |r| r.slice(columns).values.map(&:to_s) == values }
    record || ImpExp::Serializers::Errors::RecordNotFound.new(relation_class, columns.zip(values).to_h)
  end
end