Class: ActiveGraph::Node::HasN::Association
  
  
  
Defined Under Namespace
  
    
  
    
      Classes: RelFactory, RelWrapper
    
  
  Instance Attribute Summary collapse
  
  
    
      Instance Method Summary
      collapse
    
    
  
  
  
  
  
  
  
  
  
  
  #arrow_cypher
  
  
  
  
  
  
  
  
  
  #add_destroy_callbacks, #validate_dependent
  
  
  
  
  
  
  
  
  
  #decorated_rel_type, decorated_rel_type, rel_transformer
  Constructor Details
  
    
  
  
    #initialize(type, direction, name, options = {type: nil})  ⇒ Association 
  
  
  
  
    
Returns a new instance of Association.
   
 
  
  
    
      
11
12
13
14
15
16
17
18 
     | 
    
      # File 'lib/active_graph/node/has_n/association.rb', line 11
def initialize(type, direction, name, options = {type: nil})
  validate_init_arguments(type, direction, name, options)
  @type = type.to_sym
  @name = name
  @direction = direction.to_sym
  @target_class_name_from_name = name.to_s.classify
  apply_vars_from_options(options)
end
     | 
  
 
  
 
  
    Instance Attribute Details
    
      
      
      
  
  
    #dependent  ⇒ Object  
  
  
  
  
    
Returns the value of attribute dependent.
   
 
  
  
    
      
9
10
11 
     | 
    
      # File 'lib/active_graph/node/has_n/association.rb', line 9
def dependent
  @dependent
end 
     | 
  
 
    
      
      
      
  
  
    #direction  ⇒ Object  
  
  
  
  
    
Returns the value of attribute direction.
   
 
  
  
    
      
9
10
11 
     | 
    
      # File 'lib/active_graph/node/has_n/association.rb', line 9
def direction
  @direction
end 
     | 
  
 
    
      
      
      
  
  
    #model_class  ⇒ Object  
  
  
  
  
    
Returns the value of attribute model_class.
   
 
  
  
    
      
9
10
11 
     | 
    
      # File 'lib/active_graph/node/has_n/association.rb', line 9
def model_class
  @model_class
end 
     | 
  
 
    
      
      
      
  
  
    #name  ⇒ Object  
  
  
  
  
    
Returns the value of attribute name.
   
 
  
  
    
      
9
10
11 
     | 
    
      # File 'lib/active_graph/node/has_n/association.rb', line 9
def name
  @name
end 
     | 
  
 
    
      
      
      
  
  
    #relationship  ⇒ Object  
  
  
  
  
    
Returns the value of attribute relationship.
   
 
  
  
    
      
9
10
11 
     | 
    
      # File 'lib/active_graph/node/has_n/association.rb', line 9
def relationship
  @relationship
end 
     | 
  
 
    
      
      
      
  
  
    #relationship_class_name  ⇒ Object  
  
  
  
  
    
Returns the value of attribute relationship_class_name.
   
 
  
  
    
      
118
119
120 
     | 
    
      # File 'lib/active_graph/node/has_n/association.rb', line 118
def relationship_class_name
  @relationship_class_name
end 
     | 
  
 
    
      
      
      
  
  
    #type  ⇒ Object  
  
  
  
  
    
Returns the value of attribute type.
   
 
  
  
    
      
9
10
11 
     | 
    
      # File 'lib/active_graph/node/has_n/association.rb', line 9
def type
  @type
end 
     | 
  
 
    
   
  
    Instance Method Details
    
      
  
  
    #_create_relationship(start_object, node_or_nodes, properties)  ⇒ Object 
  
  
  
  
    
      
141
142
143 
     | 
    
      # File 'lib/active_graph/node/has_n/association.rb', line 141
def _create_relationship(start_object, node_or_nodes, properties)
  RelFactory.create(start_object, node_or_nodes, properties, self)
end 
     | 
  
 
    
      
  
  
    #create_method  ⇒ Object 
  
  
  
  
    
      
137
138
139 
     | 
    
      # File 'lib/active_graph/node/has_n/association.rb', line 137
def create_method
  unique? ? :create_unique : :create
end 
     | 
  
 
    
      
  
  
    #creates_unique_option  ⇒ Object 
  
  
  
  
    
      
133
134
135 
     | 
    
      # File 'lib/active_graph/node/has_n/association.rb', line 133
def creates_unique_option
  @unique || :none
end 
     | 
  
 
    
      
  
  
    #derive_model_class  ⇒ Object 
  
  
  
  
    
      
20
21
22
23
24
25
26
27 
     | 
    
      # File 'lib/active_graph/node/has_n/association.rb', line 20
def derive_model_class
  refresh_model_class! if pending_model_refresh?
  return @model_class unless @model_class.nil?
  return nil if relationship_class.nil?
  dir_class = direction == :in ? :from_class : :to_class
  return false if relationship_class.send(dir_class).to_s.to_sym == :any
  relationship_class.send(dir_class)
end 
     | 
  
 
    
      
  
  
    #discovered_model  ⇒ Object 
  
  
  
  
    
      
87
88
89
90
91 
     | 
    
      # File 'lib/active_graph/node/has_n/association.rb', line 87
def discovered_model
  target_classes.select do |constant|
    constant.ancestors.include?(::ActiveGraph::Node)
  end
end
     | 
  
 
    
      
  
  
    #inverse_of?(other)  ⇒ Boolean 
  
  
  
  
    
      
67
68
69 
     | 
    
      # File 'lib/active_graph/node/has_n/association.rb', line 67
def inverse_of?(other)
  origin_association == other
end 
     | 
  
 
    
      
  
  
    #pending_model_refresh?  ⇒ Boolean 
  
  
  
  
    
      
53
54
55 
     | 
    
      # File 'lib/active_graph/node/has_n/association.rb', line 53
def pending_model_refresh?
  !!@pending_model_refresh
end 
     | 
  
 
    
      
  
  
    #queue_model_refresh!  ⇒ Object 
  
  
  
  
    
      
36
37
38 
     | 
    
      # File 'lib/active_graph/node/has_n/association.rb', line 36
def queue_model_refresh!
  @pending_model_refresh = true
end 
     | 
  
 
    
      
  
  
    #refresh_model_class!  ⇒ Object 
  
  
  
  
    
      
29
30
31
32
33
34 
     | 
    
      # File 'lib/active_graph/node/has_n/association.rb', line 29
def refresh_model_class!
  @pending_model_refresh = @target_classes_or_nil = nil
    @model_class = ClassArguments.constantize_argument(@model_class.to_s) if @model_class
end
     | 
  
 
    
      
  
  
    #relationship_class  ⇒ Object 
  
  
  
  
    
      
124
125
126 
     | 
    
      # File 'lib/active_graph/node/has_n/association.rb', line 124
def relationship_class
  @relationship_class ||= @relationship_class_name && @relationship_class_name.constantize
end 
     | 
  
 
    
      
  
  
    #relationship_class?  ⇒ Boolean 
  
  
    Also known as:
    rel_class?
    
  
  
  
    
      
145
146
147 
     | 
    
      # File 'lib/active_graph/node/has_n/association.rb', line 145
def relationship_class?
  !!relationship_class
end 
     | 
  
 
    
      
  
  
    #relationship_class_type  ⇒ Object 
  
  
  
  
    
      
120
121
122 
     | 
    
      # File 'lib/active_graph/node/has_n/association.rb', line 120
def relationship_class_type
  relationship_class.type.to_sym
end 
     | 
  
 
    
      
  
  
    #relationship_type(create = false)  ⇒ Object 
  
  
  
  
    
      
103
104
105
106
107
108
109
110
111
112
113
114
115
116 
     | 
    
      # File 'lib/active_graph/node/has_n/association.rb', line 103
def relationship_type(create = false)
  case
  when relationship_class
    relationship_class_type
  when !@relationship_type.nil?
    @relationship_type
  when @origin
    origin_type
  else
            (create || exceptional_target_class?) && decorated_rel_type(@name)
  end
end
     | 
  
 
    
      
  
  
    #target_class  ⇒ Object 
  
  
  
  
    
      
93
94
95
96
97
98
99
100
101 
     | 
    
      # File 'lib/active_graph/node/has_n/association.rb', line 93
def target_class
  return @target_class if @target_class
  return if !(target_class_names && target_class_names.size == 1)
  class_const = ClassArguments.constantize_argument(target_class_names[0])
  @target_class = class_const
end 
     | 
  
 
    
      
  
  
    #target_class_names  ⇒ Object 
  
  
  
  
    
      
57
58
59
60
61
62
63
64
65 
     | 
    
      # File 'lib/active_graph/node/has_n/association.rb', line 57
def target_class_names
  option = target_class_option(derive_model_class)
  @target_class_names ||= if option.is_a?(Array)
                            option.map(&:to_s)
                          elsif option
                            [option.to_s]
                          end
end
     | 
  
 
    
      
  
  
    #target_class_option(model_class)  ⇒ Object 
  
  
  
  
    
      
40
41
42
43
44
45
46
47
48
49
50
51 
     | 
    
      # File 'lib/active_graph/node/has_n/association.rb', line 40
def target_class_option(model_class)
  case model_class
  when nil
    @target_class_name_from_name ? "#{association_model_namespace}::#{@target_class_name_from_name}" : @target_class_name_from_name
  when Array
    model_class.map { |sub_model_class| target_class_option(sub_model_class) }
  when false
    false
  else
    model_class.to_s[0, 2] == '::' ? model_class.to_s : "::#{model_class}"
  end
end
     | 
  
 
    
      
    
      
  
  
    #target_classes_or_nil  ⇒ Object 
  
  
  
  
    
      
75
76
77 
     | 
    
      # File 'lib/active_graph/node/has_n/association.rb', line 75
def target_classes_or_nil
  @target_classes_or_nil ||= discovered_model if target_class_names
end 
     | 
  
 
    
      
  
  
    #target_where_clause(var = name)  ⇒ Object 
  
  
  
  
    
      
79
80
81
82
83
84
85 
     | 
    
      # File 'lib/active_graph/node/has_n/association.rb', line 79
def target_where_clause(var = name)
  return if model_class == false
  Array.new(target_classes).map do |target_class|
    "#{var}:`#{target_class.mapped_label_name}`"
  end.join(' OR ')
end
     | 
  
 
    
      
  
  
    
      
128
129
130
131 
     | 
    
      # File 'lib/active_graph/node/has_n/association.rb', line 128
def unique?
  return relationship_class.unique? if rel_class?
  @origin ? origin_association.unique? : !!@unique
end 
     |