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 |
Adds a new item to the association. The entire item collection is then returned.
# 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.
# 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
# File lib/data_mapper/associations/has_many_association.rb, line 222 222: def ==(other) 223: (items.size == 1 ? first : items) == other 224: end
# 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.
# 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.
# 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
# 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
# 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.
# 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.
# 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
# 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
# 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
# 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
# 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
# File lib/data_mapper/associations/has_many_association.rb, line 105 105: def each 106: items.each { |item| yield item } 107: end
# File lib/data_mapper/associations/has_many_association.rb, line 105 105: def each 106: items.each { |item| yield item } 107: end
# File lib/data_mapper/associations/has_many_association.rb, line 214 214: def first 215: items.entries.first 216: end
# File lib/data_mapper/associations/has_many_association.rb, line 214 214: def first 215: items.entries.first 216: end
# File lib/data_mapper/associations/has_many_association.rb, line 210 210: def inspect 211: entries.inspect 212: end
# File lib/data_mapper/associations/has_many_association.rb, line 210 210: def inspect 211: entries.inspect 212: end
# 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
# 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
# File lib/data_mapper/associations/has_many_association.rb, line 218 218: def last 219: items.entries.last 220: end
# File lib/data_mapper/associations/has_many_association.rb, line 218 218: def last 219: items.entries.last 220: end
# 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
# 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
# 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
# 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
# File lib/data_mapper/associations/has_many_association.rb, line 178 178: def reload! 179: @items = nil 180: end
# File lib/data_mapper/associations/has_many_association.rb, line 178 178: def reload! 179: @items = nil 180: end
# File lib/data_mapper/associations/has_many_association.rb, line 174 174: def respond_to?(symbol) 175: items.respond_to?(symbol) || super 176: end
# File lib/data_mapper/associations/has_many_association.rb, line 174 174: def respond_to?(symbol) 175: items.respond_to?(symbol) || super 176: end
# 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
# 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
# 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
# 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
# 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
# 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
# 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