Class: ActiveRecord::Associations::AssociationCollection

Inherits:
AssociationProxy show all
Defined in:
lib/active_record/associations/association_collection.rb

Overview

:nodoc:

Instance Method Summary collapse

Methods inherited from AssociationProxy

#initialize, #loaded?, #method_missing, #proxy_respond_to?, #respond_to?

Constructor Details

This class inherits a constructor from ActiveRecord::Associations::AssociationProxy

Dynamic Method Handling

This class handles dynamic methods through the method_missing method in the class ActiveRecord::Associations::AssociationProxy

Instance Method Details

#<<(*records) ⇒ Object Also known as: push, concat

Add records to this association. Returns self so method calls may be chained.

Since << flattens its argument list and inserts each record, push and concat behave identically.



20
21
22
23
24
25
26
27
28
29
30
31
32
# File 'lib/active_record/associations/association_collection.rb', line 20

def <<(*records)
  result = true
  load_target
  @owner.transaction do
    flatten_deeper(records).each do |record|
      raise_on_type_mismatch(record)
      result &&= insert_record(record) unless @owner.new_record?
      @target << record
    end
  end

  result and self
end

#create(attributes = {}) ⇒ Object



58
59
60
61
62
63
# File 'lib/active_record/associations/association_collection.rb', line 58

def create(attributes = {})
  # Can't use Base.create since the foreign key may be a protected attribute.
  record = build(attributes)
  record.save unless @owner.new_record?
  record
end

#delete(*records) ⇒ Object

Remove records from this association. Does not destroy records.



38
39
40
41
42
43
44
45
46
47
48
# File 'lib/active_record/associations/association_collection.rb', line 38

def delete(*records)
  records = flatten_deeper(records)
  records.each { |record| raise_on_type_mismatch(record) }
  records.reject! { |record| @target.delete(record) if record.new_record? }
  return if records.empty?
  
  @owner.transaction do
    delete_records(records)
    records.each { |record| @target.delete(record) }
  end
end

#destroy_allObject



50
51
52
53
54
55
56
# File 'lib/active_record/associations/association_collection.rb', line 50

def destroy_all
  @owner.transaction do
    each { |record| record.destroy }
  end

  @target = []
end

#empty?Boolean

Returns:

  • (Boolean)


78
79
80
# File 'lib/active_record/associations/association_collection.rb', line 78

def empty?
  size.zero?
end

#lengthObject

Returns the size of the collection by loading it and calling size on the array. If you want to use this method to check whether the collection is empty, use collection.length.zero? instead of collection.empty?



74
75
76
# File 'lib/active_record/associations/association_collection.rb', line 74

def length
  load_target.size
end

#reloadObject



14
15
16
# File 'lib/active_record/associations/association_collection.rb', line 14

def reload
  reset
end

#replace(other_array) ⇒ Object



86
87
88
89
90
91
# File 'lib/active_record/associations/association_collection.rb', line 86

def replace(other_array)
  other_array.each{ |val| raise_on_type_mismatch(val) }

  @target = other_array
  @loaded = true
end

#resetObject



9
10
11
12
# File 'lib/active_record/associations/association_collection.rb', line 9

def reset
  @target = []
  @loaded = false
end

#sizeObject

Returns the size of the collection by executing a SELECT COUNT(*) query if the collection hasn’t been loaded and calling collection.size if it has. If it’s more likely than not that the collection does have a size larger than zero and you need to fetch that collection afterwards, it’ll take one less SELECT query if you use length.



68
69
70
# File 'lib/active_record/associations/association_collection.rb', line 68

def size
  if loaded? then @target.size else count_records end
end

#to_aryObject



4
5
6
7
# File 'lib/active_record/associations/association_collection.rb', line 4

def to_ary
  load_target
  @target.to_ary
end

#uniq(collection = self) ⇒ Object



82
83
84
# File 'lib/active_record/associations/association_collection.rb', line 82

def uniq(collection = self)
  collection.inject([]) { |uniq_records, record| uniq_records << record unless uniq_records.include?(record); uniq_records }
end