Class: ViewModel::ActiveRecord::UpdateOperation::MutableReferencedCollection

Inherits:
Object
  • Object
show all
Defined in:
lib/view_model/active_record/update_operation.rb

Overview

Helper class to wrap the previous members of a referenced collection and provide update operations. No one member may be affected by more than one update operation. Elements removed from the collection are collected as ‘orphaned_members`.“

Instance Attribute Summary collapse

Instance Method Summary collapse

Constructor Details

#initialize(association_data, update_context, members, blame_reference) ⇒ MutableReferencedCollection

Returns a new instance of MutableReferencedCollection.



673
674
675
676
677
678
679
680
681
682
# File 'lib/view_model/active_record/update_operation.rb', line 673

def initialize(association_data, update_context, members, blame_reference)
  @association_data = association_data
  @update_context   = update_context
  @members          = members.dup
  @blame_reference  = blame_reference

  @orphaned_members = []

  @free_members_by_indirect_ref = @members.index_by(&:indirect_viewmodel_reference)
end

Instance Attribute Details

#blame_referenceObject (readonly)

Returns the value of attribute blame_reference.



671
672
673
# File 'lib/view_model/active_record/update_operation.rb', line 671

def blame_reference
  @blame_reference
end

#membersObject (readonly)

Returns the value of attribute members.



671
672
673
# File 'lib/view_model/active_record/update_operation.rb', line 671

def members
  @members
end

#orphaned_membersObject (readonly)

Returns the value of attribute orphaned_members.



671
672
673
# File 'lib/view_model/active_record/update_operation.rb', line 671

def orphaned_members
  @orphaned_members
end

Instance Method Details

#concat(references) ⇒ Object



701
702
703
704
705
# File 'lib/view_model/active_record/update_operation.rb', line 701

def concat(references)
  new_members = claim_or_create_references(references)
  remove_from_members(new_members)
  members.concat(new_members)
end

#insert_after(relative_to, references) ⇒ Object



697
698
699
# File 'lib/view_model/active_record/update_operation.rb', line 697

def insert_after(relative_to, references)
  insert_relative(relative_to, 1, references)
end

#insert_before(relative_to, references) ⇒ Object



693
694
695
# File 'lib/view_model/active_record/update_operation.rb', line 693

def insert_before(relative_to, references)
  insert_relative(relative_to, 0, references)
end

#remove(vm_references) ⇒ Object



707
708
709
710
711
712
713
# File 'lib/view_model/active_record/update_operation.rb', line 707

def remove(vm_references)
  removed_members = vm_references.map do |vm_ref|
    claim_existing_member(vm_ref)
  end
  remove_from_members(removed_members)
  orphaned_members.concat(removed_members)
end

#replace(references) ⇒ Object



684
685
686
687
688
689
690
691
# File 'lib/view_model/active_record/update_operation.rb', line 684

def replace(references)
  members.replace(claim_or_create_references(references))

  # Any unclaimed free members after building the update target are now
  # orphaned and their direct viewmodels can be released.
  orphaned_members.concat(free_members_by_indirect_ref.values)
  free_members_by_indirect_ref.clear
end

#update(references) ⇒ Object



715
716
717
# File 'lib/view_model/active_record/update_operation.rb', line 715

def update(references)
  claim_existing_references(references)
end