Class DataMapper::Associations::HasManyAssociation::Set
In: lib/data_mapper/associations/has_many_association.rb
lib/data_mapper/associations/has_many_association.rb
Parent: Associations::Reference

Methods

Included Modules

Enumerable Enumerable

Public Instance methods

Adds a new item to the association. The entire item collection is then returned.

[Source]

     # File lib/data_mapper/associations/has_many_association.rb, line 132
132:         def <<(member)
133:           shallow_append(member)
134: 
135:           if complement = association.complementary_association
136:             member.send("#{complement.name}_association").shallow_append(@instance)
137:           end
138: 
139:           return self
140:         end

Adds a new item to the association. The entire item collection is then returned.

[Source]

     # File lib/data_mapper/associations/has_many_association.rb, line 132
132:         def <<(member)
133:           shallow_append(member)
134: 
135:           if complement = association.complementary_association
136:             member.send("#{complement.name}_association").shallow_append(@instance)
137:           end
138: 
139:           return self
140:         end

[Source]

     # File lib/data_mapper/associations/has_many_association.rb, line 222
222:         def ==(other)
223:           (items.size == 1 ? first : items) == other
224:         end

[Source]

     # File lib/data_mapper/associations/has_many_association.rb, line 222
222:         def ==(other)
223:           (items.size == 1 ? first : items) == other
224:         end

Builds a new item and returns it.

[Source]

     # File lib/data_mapper/associations/has_many_association.rb, line 110
110:         def build(options)
111:           item = association.associated_constant.new(options)
112:           self << item
113:           item
114:         end

Builds a new item and returns it.

[Source]

     # File lib/data_mapper/associations/has_many_association.rb, line 110
110:         def build(options)
111:           item = association.associated_constant.new(options)
112:           self << item
113:           item
114:         end

[Source]

     # File lib/data_mapper/associations/has_many_association.rb, line 142
142:         def clear
143:           @pending_members = nil
144:           @items = Support::TypedSet.new(association.associated_constant)
145:         end

[Source]

     # File lib/data_mapper/associations/has_many_association.rb, line 142
142:         def clear
143:           @pending_members = nil
144:           @items = Support::TypedSet.new(association.associated_constant)
145:         end

Builds and saves a new item, then returns it.

[Source]

     # File lib/data_mapper/associations/has_many_association.rb, line 117
117:         def create(options)
118:           item = build(options)
119:           item.save
120:           item
121:         end

Builds and saves a new item, then returns it.

[Source]

     # File lib/data_mapper/associations/has_many_association.rb, line 117
117:         def create(options)
118:           item = build(options)
119:           item.save
120:           item
121:         end

[Source]

     # File lib/data_mapper/associations/has_many_association.rb, line 226
226:         def deactivate
227:           case association.dependency
228:           when :destroy
229:             items.entries.each do |member|
230:               status = member.destroy! unless member.new_record?
231:               return false unless status
232:             end
233:           when :delete
234:             @instance.database_context.adapter.connection do |db|
235:               sql = association.to_delete_sql
236:               parameters = [@instance.key]
237:               db.create_command(sql).execute_non_query(*parameters)
238:             end
239:           when :protect
240:             unless items.empty?
241:               raise AssociationProtectedError.new("You cannot delete this model while it has items associated with it.")
242:             end
243:           when :nullify
244:             nullify_association
245:           else
246:             nullify_association
247:           end
248:         end

[Source]

     # File lib/data_mapper/associations/has_many_association.rb, line 226
226:         def deactivate
227:           case association.dependency
228:           when :destroy
229:             items.entries.each do |member|
230:               status = member.destroy! unless member.new_record?
231:               return false unless status
232:             end
233:           when :delete
234:             @instance.database_context.adapter.connection do |db|
235:               sql = association.to_delete_sql
236:               parameters = [@instance.key]
237:               db.create_command(sql).execute_non_query(*parameters)
238:             end
239:           when :protect
240:             unless items.empty?
241:               raise AssociationProtectedError.new("You cannot delete this model while it has items associated with it.")
242:             end
243:           when :nullify
244:             nullify_association
245:           else
246:             nullify_association
247:           end
248:         end

[Source]

    # File lib/data_mapper/associations/has_many_association.rb, line 62
62:         def dirty?(cleared = ::Set.new)
63:           loaded_members.any? { |member| cleared.include?(member) || member.dirty?(cleared) }
64:         end

[Source]

    # File lib/data_mapper/associations/has_many_association.rb, line 62
62:         def dirty?(cleared = ::Set.new)
63:           loaded_members.any? { |member| cleared.include?(member) || member.dirty?(cleared) }
64:         end

[Source]

     # File lib/data_mapper/associations/has_many_association.rb, line 105
105:         def each
106:           items.each { |item| yield item }
107:         end

[Source]

     # File lib/data_mapper/associations/has_many_association.rb, line 105
105:         def each
106:           items.each { |item| yield item }
107:         end

[Source]

     # File lib/data_mapper/associations/has_many_association.rb, line 214
214:         def first
215:           items.entries.first
216:         end

[Source]

     # File lib/data_mapper/associations/has_many_association.rb, line 214
214:         def first
215:           items.entries.first
216:         end

[Source]

     # File lib/data_mapper/associations/has_many_association.rb, line 210
210:         def inspect
211:           entries.inspect
212:         end

[Source]

     # File lib/data_mapper/associations/has_many_association.rb, line 210
210:         def inspect
211:           entries.inspect
212:         end

[Source]

     # File lib/data_mapper/associations/has_many_association.rb, line 182
182:         def items
183:           @items || begin
184:             if @instance.loaded_set.nil?
185:               @items = Support::TypedSet.new(association.associated_constant)
186:             else
187:               associated_items = fetch_sets
188: 
189:               # This is where @items is set, by calling association=,
190:               # which in turn calls HasManyAssociation::Set#set.
191:               association_ivar_name = association.instance_variable_name
192:               setter_method = "#{@association_name}=".to_sym
193:               @instance.loaded_set.each do |entry|
194:                 entry.send(setter_method, associated_items[entry.key]) if entry.respond_to?(setter_method)
195:               end # @instance.loaded_set.each
196:             end # if @instance.loaded_set.nil?
197: 
198:             if @pending_members
199:               pending_members.each do |member|
200:                 @items << member
201:               end
202: 
203:               pending_members.clear
204:             end
205: 
206:             return @items
207:           end # begin
208:         end

[Source]

     # File lib/data_mapper/associations/has_many_association.rb, line 182
182:         def items
183:           @items || begin
184:             if @instance.loaded_set.nil?
185:               @items = Support::TypedSet.new(association.associated_constant)
186:             else
187:               associated_items = fetch_sets
188: 
189:               # This is where @items is set, by calling association=,
190:               # which in turn calls HasManyAssociation::Set#set.
191:               association_ivar_name = association.instance_variable_name
192:               setter_method = "#{@association_name}=".to_sym
193:               @instance.loaded_set.each do |entry|
194:                 entry.send(setter_method, associated_items[entry.key]) if entry.respond_to?(setter_method)
195:               end # @instance.loaded_set.each
196:             end # if @instance.loaded_set.nil?
197: 
198:             if @pending_members
199:               pending_members.each do |member|
200:                 @items << member
201:               end
202: 
203:               pending_members.clear
204:             end
205: 
206:             return @items
207:           end # begin
208:         end

[Source]

     # File lib/data_mapper/associations/has_many_association.rb, line 218
218:         def last
219:           items.entries.last
220:         end

[Source]

     # File lib/data_mapper/associations/has_many_association.rb, line 218
218:         def last
219:           items.entries.last
220:         end

[Source]

     # File lib/data_mapper/associations/has_many_association.rb, line 156
156:         def method_missing(symbol, *args, &block)
157:           if items.respond_to?(symbol)
158:             items.send(symbol, *args, &block)
159:           elsif association.associated_table.associations.any? { |assoc| assoc.name == symbol }
160:             results = []
161:             each do |item|
162:               unless (val = item.send(symbol)).blank?
163:                 results << (val.is_a?(Enumerable) ? val.entries : val)
164:               end
165:             end
166:             results.flatten
167:           elsif items.size == 1 && items.entries.first.respond_to?(symbol)
168:             items.entries.first.send(symbol, *args, &block)
169:           else
170:             super
171:           end
172:         end

[Source]

     # File lib/data_mapper/associations/has_many_association.rb, line 156
156:         def method_missing(symbol, *args, &block)
157:           if items.respond_to?(symbol)
158:             items.send(symbol, *args, &block)
159:           elsif association.associated_table.associations.any? { |assoc| assoc.name == symbol }
160:             results = []
161:             each do |item|
162:               unless (val = item.send(symbol)).blank?
163:                 results << (val.is_a?(Enumerable) ? val.entries : val)
164:               end
165:             end
166:             results.flatten
167:           elsif items.size == 1 && items.entries.first.respond_to?(symbol)
168:             items.entries.first.send(symbol, *args, &block)
169:           else
170:             super
171:           end
172:         end

Returns true if the association has zero items

[Source]

    # File lib/data_mapper/associations/has_many_association.rb, line 58
58:         def nil?
59:           loaded_members.blank?
60:         end

Returns true if the association has zero items

[Source]

    # File lib/data_mapper/associations/has_many_association.rb, line 58
58:         def nil?
59:           loaded_members.blank?
60:         end

[Source]

     # File lib/data_mapper/associations/has_many_association.rb, line 250
250:         def nullify_association
251:           @instance.database_context.adapter.connection do |db|
252:             sql = association.to_disassociate_sql
253:             parameters = [@instance.key]
254:             db.create_command(sql).execute_non_query(*parameters)
255:           end
256:         end

[Source]

     # File lib/data_mapper/associations/has_many_association.rb, line 250
250:         def nullify_association
251:           @instance.database_context.adapter.connection do |db|
252:             sql = association.to_disassociate_sql
253:             parameters = [@instance.key]
254:             db.create_command(sql).execute_non_query(*parameters)
255:           end
256:         end

[Source]

     # File lib/data_mapper/associations/has_many_association.rb, line 178
178:         def reload!
179:           @items = nil
180:         end

[Source]

     # File lib/data_mapper/associations/has_many_association.rb, line 178
178:         def reload!
179:           @items = nil
180:         end

[Source]

     # File lib/data_mapper/associations/has_many_association.rb, line 174
174:         def respond_to?(symbol)
175:           items.respond_to?(symbol) || super
176:         end

[Source]

     # File lib/data_mapper/associations/has_many_association.rb, line 174
174:         def respond_to?(symbol)
175:           items.respond_to?(symbol) || super
176:         end

[Source]

     # File lib/data_mapper/associations/has_many_association.rb, line 70
 70:         def save_without_validation(database_context, cleared)
 71: 
 72:           adapter = @instance.database_context.adapter
 73: 
 74:           members = loaded_members
 75: 
 76:           adapter.connection do |db|
 77: 
 78:             sql = association.to_disassociate_sql
 79:             parameters = [@instance.key]
 80: 
 81:             member_keys = members.map { |member| member.key }.compact
 82: 
 83:             unless member_keys.empty?
 84:               sql << " AND #{association.associated_table.key} NOT IN ?"
 85:               parameters << member_keys
 86:             end
 87: 
 88:             db.create_command(sql).execute_non_query(*parameters)
 89:           end
 90: 
 91:           unless members.blank?
 92: 
 93:             setter_method = "#{@association_name}=".to_sym
 94:             ivar_name = association.foreign_key_column.instance_variable_name
 95:             original_value_name = association.foreign_key_column.name
 96: 
 97:             members.each do |member|
 98:               member.original_values.delete(original_value_name)
 99:               member.instance_variable_set(ivar_name, @instance.key)
100:               @instance.database_context.adapter.save_without_validation(database_context, member, cleared)
101:             end
102:           end
103:         end

[Source]

     # File lib/data_mapper/associations/has_many_association.rb, line 70
 70:         def save_without_validation(database_context, cleared)
 71: 
 72:           adapter = @instance.database_context.adapter
 73: 
 74:           members = loaded_members
 75: 
 76:           adapter.connection do |db|
 77: 
 78:             sql = association.to_disassociate_sql
 79:             parameters = [@instance.key]
 80: 
 81:             member_keys = members.map { |member| member.key }.compact
 82: 
 83:             unless member_keys.empty?
 84:               sql << " AND #{association.associated_table.key} NOT IN ?"
 85:               parameters << member_keys
 86:             end
 87: 
 88:             db.create_command(sql).execute_non_query(*parameters)
 89:           end
 90: 
 91:           unless members.blank?
 92: 
 93:             setter_method = "#{@association_name}=".to_sym
 94:             ivar_name = association.foreign_key_column.instance_variable_name
 95:             original_value_name = association.foreign_key_column.name
 96: 
 97:             members.each do |member|
 98:               member.original_values.delete(original_value_name)
 99:               member.instance_variable_set(ivar_name, @instance.key)
100:               @instance.database_context.adapter.save_without_validation(database_context, member, cleared)
101:             end
102:           end
103:         end

[Source]

     # File lib/data_mapper/associations/has_many_association.rb, line 123
123:         def set(value)
124:           values = value.is_a?(Enumerable) ? value : [value]
125:           @items = Support::TypedSet.new(association.associated_constant)
126:           values.each do |item|
127:             self << item
128:           end
129:         end

[Source]

     # File lib/data_mapper/associations/has_many_association.rb, line 123
123:         def set(value)
124:           values = value.is_a?(Enumerable) ? value : [value]
125:           @items = Support::TypedSet.new(association.associated_constant)
126:           values.each do |item|
127:             self << item
128:           end
129:         end

[Source]

     # File lib/data_mapper/associations/has_many_association.rb, line 147
147:         def shallow_append(member)
148:           if @items
149:             self.items << member
150:           else
151:             pending_members << member
152:           end
153:           return self
154:         end

[Source]

     # File lib/data_mapper/associations/has_many_association.rb, line 147
147:         def shallow_append(member)
148:           if @items
149:             self.items << member
150:           else
151:             pending_members << member
152:           end
153:           return self
154:         end

[Source]

    # File lib/data_mapper/associations/has_many_association.rb, line 66
66:         def validate_recursively(event, cleared)
67:           loaded_members.all? { |member| cleared.include?(member) || member.validate_recursively(event, cleared) }
68:         end

[Source]

    # File lib/data_mapper/associations/has_many_association.rb, line 66
66:         def validate_recursively(event, cleared)
67:           loaded_members.all? { |member| cleared.include?(member) || member.validate_recursively(event, cleared) }
68:         end

[Validate]