Class: ImpExp::Serializers::RelationOneToMany
- Inherits:
-
Object
- Object
- ImpExp::Serializers::RelationOneToMany
- Defined in:
- app/services/imp_exp/serializers/relation_one_to_many.rb
Constant Summary collapse
- SEPARATOR =
','
Instance Attribute Summary collapse
-
#class_name ⇒ Object
readonly
Returns the value of attribute class_name.
-
#columns ⇒ Object
readonly
Returns the value of attribute columns.
Instance Method Summary collapse
- #dump(record, relation_name) ⇒ Object
-
#initialize(*columns, class_name: nil) ⇒ RelationOneToMany
constructor
A new instance of RelationOneToMany.
- #load(data, model:, relation_name:, scoping_parent:) ⇒ Object
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_name ⇒ Object (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 |
#columns ⇒ Object (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 |