Class: ActiveRecord::Associations::AssociationCollection

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

Overview

:nodoc:

Instance Method Summary collapse

Constructor Details

#initialize(owner, association_name, association_class_name, association_class_primary_key_name, options) ⇒ AssociationCollection

Returns a new instance of AssociationCollection.



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

def initialize(owner, association_name, association_class_name, association_class_primary_key_name, options)
  @owner = owner
  @options = options
  @association_name = association_name
  @association_class = eval(association_class_name)
  @association_class_primary_key_name = association_class_primary_key_name
end

Dynamic Method Handling

This class handles dynamic methods through the method_missing method

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



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

def method_missing(symbol, *args, &block)
  load_collection
  @collection.send(symbol, *args, &block)
end

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.



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

def <<(*records)
  @owner.transaction do
    flatten_deeper(records).each do |record|
      raise_on_type_mismatch(record)
      insert_record(record)
      @collection << record if loaded?
    end
  end

  self
end

#delete(*records) ⇒ Object

Remove records from this association. Does not destroy records.



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

def delete(*records)
  records = flatten_deeper(records)
  
  @owner.transaction do
    records.each { |record| raise_on_type_mismatch(record) }
    delete_records(records)
    records.each { |record| @collection.delete(record) } if loaded?
  end
end

#destroy_allObject



65
66
67
68
69
70
71
# File 'lib/active_record/associations/association_collection.rb', line 65

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

  @collection = []
end

#empty?Boolean

Returns:

  • (Boolean)


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

def empty?
  size == 0
end

#proxy_respond_to?Object



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

alias_method :proxy_respond_to?, :respond_to?

#reloadObject



33
34
35
# File 'lib/active_record/associations/association_collection.rb', line 33

def reload
  @collection = nil
end

#respond_to?(symbol, include_priv = false) ⇒ Boolean

Returns:

  • (Boolean)


25
26
27
# File 'lib/active_record/associations/association_collection.rb', line 25

def respond_to?(symbol, include_priv = false)
  proxy_respond_to?(symbol, include_priv) || [].respond_to?(symbol, include_priv)
end

#sizeObject Also known as: length



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

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

#to_aryObject



20
21
22
23
# File 'lib/active_record/associations/association_collection.rb', line 20

def to_ary
  load_collection
  @collection.to_ary
end

#uniq(collection = self) ⇒ Object



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

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