Class: ActiveRecord::Associations::HasManyAssociation

Inherits:
AssociationCollection show all
Defined in:
lib/active_record/associations/has_many_association.rb

Overview

:nodoc:

Instance Method Summary collapse

Methods inherited from AssociationCollection

#concat, #destroy_all, #empty?, #method_missing, #proxy_respond_to?, #reload, #respond_to?, #size, #to_ary

Constructor Details

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

Returns a new instance of HasManyAssociation.



4
5
6
7
8
9
10
11
12
13
14
15
# File 'lib/active_record/associations/has_many_association.rb', line 4

def initialize(owner, association_name, association_class_name, association_class_primary_key_name, options)
  super(owner, association_name, association_class_name, association_class_primary_key_name, options)
  @conditions = options[:conditions]
  
  if options[:finder_sql]
    @counter_sql = options[:finder_sql].gsub(/SELECT (.*) FROM/, "SELECT COUNT(*) FROM")
    @finder_sql = options[:finder_sql]
  else
    @counter_sql = "#{@association_class_primary_key_name} = '#{@owner.id}'#{@conditions ? " AND " + @conditions : ""}"
    @finder_sql = "#{@association_class_primary_key_name} = '#{@owner.id}' #{@conditions ? " AND " + @conditions : ""}"   
  end
end

Dynamic Method Handling

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

Instance Method Details

#<<(record) ⇒ Object



17
18
19
20
21
22
# File 'lib/active_record/associations/has_many_association.rb', line 17

def <<(record)
  raise ActiveRecord::AssociationTypeMismatch unless @association_class === record
  record.send(@association_class_primary_key_name + "=", @owner.id)
  record.save(false)
  @collection_array << record unless @collection_array.nil?
end

#build(attributes = {}) ⇒ Object



44
45
46
47
48
# File 'lib/active_record/associations/has_many_association.rb', line 44

def build(attributes = {})
  association = @association_class.new
  association.attributes = attributes.merge({ "#{@association_class_primary_key_name}" => @owner.id})
  association
end

#create(attributes = {}) ⇒ Object



33
34
35
36
37
38
39
40
41
42
# File 'lib/active_record/associations/has_many_association.rb', line 33

def create(attributes = {})
  # We can't use the regular Base.create method as the foreign key might be a protected attribute, hence the repetion
  record = @association_class.new(attributes || {})
  record.send(@association_class_primary_key_name + "=", @owner.id)
  record.save

  @collection_array << record unless @collection_array.nil?
  
  return record
end

#delete(records) ⇒ Object



24
25
26
27
28
29
30
31
# File 'lib/active_record/associations/has_many_association.rb', line 24

def delete(records)
  duplicated_records_array(records).each do |record|
    next if record.send(@association_class_primary_key_name) != @owner.id
    record.send(@association_class_primary_key_name + "=", nil)
    record.save(false)
    @collection_array.delete(record) unless @collection_array.nil?
  end
end

#find(association_id = nil, &block) ⇒ Object



65
66
67
68
69
70
71
72
73
74
# File 'lib/active_record/associations/has_many_association.rb', line 65

def find(association_id = nil, &block)
  if block_given? || @options[:finder_sql]
    load_collection_to_array
    return @collection_array.send(:find, &block)
  else
    @association_class.find_on_conditions(
        association_id, "#{@association_class_primary_key_name} = '#{@owner.id}' #{@conditions ? " AND " + @conditions : ""}"
      )
  end
end

#find_all(runtime_conditions = nil, orderings = nil, limit = nil, joins = nil, &block) ⇒ Object



50
51
52
53
54
55
56
57
58
59
60
61
62
63
# File 'lib/active_record/associations/has_many_association.rb', line 50

def find_all(runtime_conditions = nil, orderings = nil, limit = nil, joins = nil, &block)
  if block_given? || @options[:finder_sql]
    load_collection_to_array
    @collection_array.send(:find_all, &block)
  else
    @association_class.find_all(
        "#{@association_class_primary_key_name} = '#{@owner.id}' " +
        "#{@conditions ? " AND " + @conditions : ""} #{runtime_conditions ? " AND " + runtime_conditions : ""}",
        orderings, 
        limit, 
        joins
      )
  end
end