Module: Dagnabit::Vertex::Bonding

Defined in:
lib/dagnabit/vertex/bonding.rb

Overview

Contains methods for bonding a vertex to a graph.

Instance Method Summary collapse

Instance Method Details

#bond_for(graph) ⇒ Array<edge_model>

Calculates a bond for this vertex (the method receiver) to all source vertices of graph.

This method expects the receiver to have been persisted, and will raise RuntimeError if that is not the case.

Persisted edges that already connect the receiver vertex to source vertices in graph will not be duplicated. Unpersisted edges connecting the receiver to a source in graph will be duplicated, so it is advised that you ensure that all vertices and edges in graph have been persisted before using #bond_for.

This method requires the existence of an edge model; see Settings#edge_model and Settings#edge_model_name=. If an edge model has not been set, this method raises RuntimeError.

Edges instantiated by bond_for are not automatically saved.

Parameters:

Returns:

  • (Array<edge_model>)

    a list of edges that, when saved, will bond the vertex to graph

Raises:

  • (RuntimeError)

    if an edge model has not been set



30
31
32
33
34
35
36
37
38
39
40
41
# File 'lib/dagnabit/vertex/bonding.rb', line 30

def bond_for(graph)
  edge = self.class.edge_model

  raise 'edge_model must be set' unless edge
  raise "#{self} must be persisted before invoking bond_for" if new_record?

  sources = graph.sources
  existing = edge.all(:conditions => { :parent_id => id, :child_id => sources.map(&:id) }).map { |e| [e.parent_id, e.child_id] }
  new = sources.inject([]) { |es, s| es << [id, s.id] }

  (new - existing).map { |p, c| edge.new(:parent_id => p, :child_id => c) }
end