Class: ActiveRecord::Associations::Builder::Association

Inherits:
Object
  • Object
show all
Defined in:
activerecord/lib/active_record/associations/builder/association.rb

Overview

:nodoc:

Direct Known Subclasses

CollectionAssociation, SingularAssociation

Class Attribute Summary collapse

Instance Attribute Summary collapse

Class Method Summary collapse

Instance Method Summary collapse

Constructor Details

#initialize(model, name, scope, options) ⇒ Association

Returns a new instance of Association

Raises:

  • (ArgumentError)

29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
# File 'activerecord/lib/active_record/associations/builder/association.rb', line 29

def initialize(model, name, scope, options)
  raise ArgumentError, "association names must be a Symbol" unless name.kind_of?(Symbol)

  @model   = model
  @name    = name

  if scope.is_a?(Hash)
    @scope   = nil
    @options = scope
  else
    @scope   = scope
    @options = options
  end

  if @scope && @scope.arity == 0
    prev_scope = @scope
    @scope = proc { instance_exec(&prev_scope) }
  end
end

Class Attribute Details

.extensionsObject

Returns the value of attribute extensions


17
18
19
# File 'activerecord/lib/active_record/associations/builder/association.rb', line 17

def extensions
  @extensions
end

.valid_optionsObject

Returns the value of attribute valid_options


16
17
18
# File 'activerecord/lib/active_record/associations/builder/association.rb', line 16

def valid_options
  @valid_options
end

Instance Attribute Details

#modelObject (readonly)

Returns the value of attribute model


23
24
25
# File 'activerecord/lib/active_record/associations/builder/association.rb', line 23

def model
  @model
end

#nameObject (readonly)

Returns the value of attribute name


23
24
25
# File 'activerecord/lib/active_record/associations/builder/association.rb', line 23

def name
  @name
end

#optionsObject (readonly)

Returns the value of attribute options


23
24
25
# File 'activerecord/lib/active_record/associations/builder/association.rb', line 23

def options
  @options
end

#scopeObject (readonly)

Returns the value of attribute scope


23
24
25
# File 'activerecord/lib/active_record/associations/builder/association.rb', line 23

def scope
  @scope
end

Class Method Details

.build(*args, &block) ⇒ Object


25
26
27
# File 'activerecord/lib/active_record/associations/builder/association.rb', line 25

def self.build(*args, &block)
  new(*args, &block).build
end

Instance Method Details

#buildObject


53
54
55
56
57
58
59
60
61
62
# File 'activerecord/lib/active_record/associations/builder/association.rb', line 53

def build
  validate_options
  define_accessors
  configure_dependency if options[:dependent]
  reflection = ActiveRecord::Reflection.create(macro, name, scope, options, model)
  Association.extensions.each do |extension|
    extension.build @model, reflection
  end
  reflection
end

#configure_dependencyObject


104
105
106
107
108
109
110
111
# File 'activerecord/lib/active_record/associations/builder/association.rb', line 104

def configure_dependency
  unless valid_dependent_options.include? options[:dependent]
    raise ArgumentError, "The :dependent option must be one of #{valid_dependent_options}, but is :#{options[:dependent]}"
  end

  n = name
  model.before_destroy lambda { |o| o.association(n).handle_dependency }
end

#define_accessorsObject

Defines the setter and getter methods for the association class Post < ActiveRecord::Base

has_many :comments

end

Post.first.comments and Post.first.comments= methods are defined by this method…


83
84
85
86
# File 'activerecord/lib/active_record/associations/builder/association.rb', line 83

def define_accessors
  define_readers
  define_writers
end

#define_readersObject


88
89
90
91
92
93
94
# File 'activerecord/lib/active_record/associations/builder/association.rb', line 88

def define_readers
  mixin.class_eval <<-CODE, __FILE__, __LINE__ + 1
    def #{name}(*args)
      association(:#{name}).reader(*args)
    end
  CODE
end

#define_writersObject


96
97
98
99
100
101
102
# File 'activerecord/lib/active_record/associations/builder/association.rb', line 96

def define_writers
  mixin.class_eval <<-CODE, __FILE__, __LINE__ + 1
    def #{name}=(value)
      association(:#{name}).writer(value)
    end
  CODE
end

#macroObject

Raises:

  • (NotImplementedError)

64
65
66
# File 'activerecord/lib/active_record/associations/builder/association.rb', line 64

def macro
  raise NotImplementedError
end

#mixinObject


49
50
51
# File 'activerecord/lib/active_record/associations/builder/association.rb', line 49

def mixin
  @model.generated_feature_methods
end

#valid_dependent_optionsObject

Raises:

  • (NotImplementedError)

113
114
115
# File 'activerecord/lib/active_record/associations/builder/association.rb', line 113

def valid_dependent_options
  raise NotImplementedError
end

#valid_optionsObject


68
69
70
# File 'activerecord/lib/active_record/associations/builder/association.rb', line 68

def valid_options
  Association.valid_options + Association.extensions.flat_map(&:valid_options)
end

#validate_optionsObject


72
73
74
# File 'activerecord/lib/active_record/associations/builder/association.rb', line 72

def validate_options
  options.assert_valid_keys(valid_options)
end