Class: DataMapper::Associations::HasManyAssociation::Set

Inherits:
Reference show all
Includes:
Enumerable
Defined in:
lib/data_mapper/associations/has_many_association.rb

Instance Method Summary collapse

Methods inherited from Reference

#association, #initialize

Constructor Details

This class inherits a constructor from DataMapper::Associations::Reference

Dynamic Method Handling

This class handles dynamic methods through the method_missing method

#method_missing(symbol, *args, &block) ⇒ Object



104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
# File 'lib/data_mapper/associations/has_many_association.rb', line 104

def method_missing(symbol, *args, &block)
  if items.respond_to?(symbol)
    items.send(symbol, *args, &block)
  elsif association.associated_table.associations.any? { |assoc| assoc.name == symbol }
    results = []
    each do |item|
      unless (val = item.send(symbol)).blank?
        results << (val.is_a?(Enumerable) ? val.entries : val)
      end
    end
    results.flatten
  elsif items.size == 1 && items.first.respond_to?(symbol)
    items.first.send(symbol, *args, &block)
  else
    super
  end
end

Instance Method Details

#<<(associated_item) ⇒ Object



70
71
72
73
74
75
76
77
78
79
80
81
82
# File 'lib/data_mapper/associations/has_many_association.rb', line 70

def <<(associated_item)
  (@items || @items = []) << associated_item
  
  # TODO: Optimize!
  fk = association.foreign_key_column
  foreign_association = association.associated_table.associations.find do |mapping|
    mapping.is_a?(BelongsToAssociation) && mapping.foreign_key_column == fk
  end
  
  associated_item.send("#{foreign_association.name}=", @instance) if foreign_association
  
  return @items
end

#==(other) ⇒ Object



154
155
156
# File 'lib/data_mapper/associations/has_many_association.rb', line 154

def ==(other)
  (items.size == 1 ? items.first : items) == other
end

#build(options) ⇒ Object



84
85
86
87
88
# File 'lib/data_mapper/associations/has_many_association.rb', line 84

def build(options)
  item = association.associated_constant.new(options)
  self << item
  item
end

#create(options) ⇒ Object



90
91
92
93
94
# File 'lib/data_mapper/associations/has_many_association.rb', line 90

def create(options)
  item = build(options)
  item.save
  item
end

#dirty?Boolean

Returns:

  • (Boolean)


37
38
39
# File 'lib/data_mapper/associations/has_many_association.rb', line 37

def dirty?
  @items && @items.any? { |item| item.dirty? }
end

#eachObject



66
67
68
# File 'lib/data_mapper/associations/has_many_association.rb', line 66

def each
  items.each { |item| yield item }
end

#inspectObject

def items



150
151
152
# File 'lib/data_mapper/associations/has_many_association.rb', line 150

def inspect
  entries.inspect
end

#itemsObject



130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
# File 'lib/data_mapper/associations/has_many_association.rb', line 130

def items
  @items || begin
    if @instance.loaded_set.nil?
      @items = []
    else              
      associated_items = fetch_sets
      
      # This is where @items is set, by calling association=,
      # which in turn calls HasManyAssociation::Set#set.
      association_ivar_name = association.instance_variable_name
      setter_method = "#{@association_name}=".to_sym
      @instance.loaded_set.each do |entry|
        entry.send(setter_method, associated_items[entry.key])
      end # @instance.loaded_set.each
      
      return @items
    end # if @instance.loaded_set.nil?
  end # begin
end

#reload!Object



126
127
128
# File 'lib/data_mapper/associations/has_many_association.rb', line 126

def reload!
  @items = nil
end

#respond_to?(symbol) ⇒ Boolean

Returns:

  • (Boolean)


122
123
124
# File 'lib/data_mapper/associations/has_many_association.rb', line 122

def respond_to?(symbol)
  items.respond_to?(symbol) || super
end

#save_without_validation(database_context) ⇒ Object



45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
# File 'lib/data_mapper/associations/has_many_association.rb', line 45

def save_without_validation(database_context)
  
  adapter = @instance.database_context.adapter
  
  adapter.connection do |db|
    command = db.create_command(association.to_disassociate_sql)
    command.execute_non_query(@instance.key)
  end
  
  unless @items.nil? || @items.empty?
    
    
    setter_method = "#{@association_name}=".to_sym
    ivar_name = association.foreign_key_column.instance_variable_name
    @items.each do |item|
      item.instance_variable_set(ivar_name, @instance.key)
      @instance.database_context.adapter.save_without_validation(database_context, item)
    end
  end
end

#set(value) ⇒ Object



96
97
98
99
100
101
102
# File 'lib/data_mapper/associations/has_many_association.rb', line 96

def set(value)
  values = value.is_a?(Enumerable) ? value : [value]
  @items = []
  values.each do |item|
    self << item
  end
end

#validate_recursively(event, cleared) ⇒ Object



41
42
43
# File 'lib/data_mapper/associations/has_many_association.rb', line 41

def validate_recursively(event, cleared)
  @items.blank? || @items.all? { |item| cleared.include?(item) || item.validate_recursively(event, cleared) }
end