Class: ActiveRecord::Associations::AssociationProxy
- Inherits:
-
Object
- Object
- ActiveRecord::Associations::AssociationProxy
- Defined in:
- lib/gems/activerecord-2.2.2/lib/active_record/associations/association_proxy.rb
Overview
This is the root class of all association proxies:
AssociationProxy
BelongsToAssociation
HasOneAssociation
BelongsToPolymorphicAssociation
AssociationCollection
HasAndBelongsToManyAssociation
HasManyAssociation
HasManyThroughAssociation
HasOneThroughAssociation
Association proxies in Active Record are middlemen between the object that holds the association, known as the @owner
, and the actual associated object, known as the @target
. The kind of association any proxy is about is available in @reflection
. That’s an instance of the class ActiveRecord::Reflection::AssociationReflection.
For example, given
class Blog < ActiveRecord::Base
has_many :posts
end
blog = Blog.find(:first)
the association proxy in blog.posts
has the object in blog
as @owner
, the collection of its posts as @target
, and the @reflection
object represents a :has_many
macro.
This class has most of the basic instance methods removed, and delegates unknown methods to @target
via method_missing
. As a corner case, it even removes the class
method and that’s why you get
blog.posts.class # => Array
though the object behind blog.posts
is not an Array, but an ActiveRecord::Associations::HasManyAssociation.
The @target
object is not loaded until needed. For example,
blog.posts.count
is computed directly through SQL and does not trigger by itself the instantiation of the actual post records.
Direct Known Subclasses
AssociationCollection, BelongsToAssociation, BelongsToPolymorphicAssociation
Instance Method Summary collapse
-
#===(other) ⇒ Object
Forwards
===
explicitly to the target because the instance method removal above doesn’t catch it. -
#aliased_table_name ⇒ Object
Returns the name of the table of the related class:.
-
#conditions ⇒ Object
(also: #sql_conditions)
Returns the SQL string that corresponds to the
:conditions
option of the macro, if given, ornil
otherwise. -
#initialize(owner, reflection) ⇒ AssociationProxy
constructor
A new instance of AssociationProxy.
-
#inspect ⇒ Object
Forwards the call to the target.
-
#loaded ⇒ Object
Asserts the target has been loaded setting the loaded flag to
true
. -
#loaded? ⇒ Boolean
Has the target been already loaded?.
-
#proxy_owner ⇒ Object
Returns the owner of the proxy.
-
#proxy_reflection ⇒ Object
Returns the reflection object that represents the association handled by the proxy.
-
#proxy_respond_to? ⇒ Object
:nodoc:.
-
#proxy_target ⇒ Object
Returns the target of the proxy, same as
target
. -
#reload ⇒ Object
Reloads the target and returns
self
on success. -
#reset ⇒ Object
Resets the loaded flag to
false
and sets the target tonil
. -
#respond_to?(*args) ⇒ Boolean
Does the proxy or its target respond to
symbol
?. - #send(method, *args) ⇒ Object
-
#target ⇒ Object
Returns the target of this proxy, same as
proxy_target
. -
#target=(target) ⇒ Object
Sets the target of this proxy to
\target
, and the loaded flag totrue
.
Constructor Details
#initialize(owner, reflection) ⇒ AssociationProxy
Returns a new instance of AssociationProxy.
54 55 56 57 58 |
# File 'lib/gems/activerecord-2.2.2/lib/active_record/associations/association_proxy.rb', line 54 def initialize(owner, reflection) @owner, @reflection = owner, reflection Array(reflection.[:extend]).each { |ext| proxy_extend(ext) } reset end |
Dynamic Method Handling
This class handles dynamic methods through the method_missing method
#method_missing(method, *args) ⇒ Object (private)
Forwards any missing method call to the target.
207 208 209 210 211 212 213 214 215 216 217 |
# File 'lib/gems/activerecord-2.2.2/lib/active_record/associations/association_proxy.rb', line 207 def method_missing(method, *args) if load_target raise NoMethodError unless @target.respond_to?(method) if block_given? @target.send(method, *args) { |*block_args| yield(*block_args) } else @target.send(method, *args) end end end |
Instance Method Details
#===(other) ⇒ Object
Forwards ===
explicitly to the target because the instance method removal above doesn’t catch it. Loads the target if needed.
83 84 85 86 |
# File 'lib/gems/activerecord-2.2.2/lib/active_record/associations/association_proxy.rb', line 83 def ===(other) load_target other === @target end |
#aliased_table_name ⇒ Object
Returns the name of the table of the related class:
post.comments.aliased_table_name # => "comments"
92 93 94 |
# File 'lib/gems/activerecord-2.2.2/lib/active_record/associations/association_proxy.rb', line 92 def aliased_table_name @reflection.klass.table_name end |
#conditions ⇒ Object Also known as: sql_conditions
Returns the SQL string that corresponds to the :conditions
option of the macro, if given, or nil
otherwise.
98 99 100 |
# File 'lib/gems/activerecord-2.2.2/lib/active_record/associations/association_proxy.rb', line 98 def conditions @conditions ||= interpolate_sql(@reflection.sanitized_conditions) if @reflection.sanitized_conditions end |
#inspect ⇒ Object
Forwards the call to the target. Loads the target if needed.
138 139 140 141 |
# File 'lib/gems/activerecord-2.2.2/lib/active_record/associations/association_proxy.rb', line 138 def inspect load_target @target.inspect end |
#loaded ⇒ Object
Asserts the target has been loaded setting the loaded flag to true
.
122 123 124 |
# File 'lib/gems/activerecord-2.2.2/lib/active_record/associations/association_proxy.rb', line 122 def loaded @loaded = true end |
#loaded? ⇒ Boolean
Has the target been already loaded?
117 118 119 |
# File 'lib/gems/activerecord-2.2.2/lib/active_record/associations/association_proxy.rb', line 117 def loaded? @loaded end |
#proxy_owner ⇒ Object
Returns the owner of the proxy.
61 62 63 |
# File 'lib/gems/activerecord-2.2.2/lib/active_record/associations/association_proxy.rb', line 61 def proxy_owner @owner end |
#proxy_reflection ⇒ Object
Returns the reflection object that represents the association handled by the proxy.
67 68 69 |
# File 'lib/gems/activerecord-2.2.2/lib/active_record/associations/association_proxy.rb', line 67 def proxy_reflection @reflection end |
#proxy_respond_to? ⇒ Object
:nodoc:
49 |
# File 'lib/gems/activerecord-2.2.2/lib/active_record/associations/association_proxy.rb', line 49 alias_method :proxy_respond_to?, :respond_to? |
#proxy_target ⇒ Object
Returns the target of the proxy, same as target
.
72 73 74 |
# File 'lib/gems/activerecord-2.2.2/lib/active_record/associations/association_proxy.rb', line 72 def proxy_target @target end |
#reload ⇒ Object
Reloads the target and returns self
on success.
110 111 112 113 114 |
# File 'lib/gems/activerecord-2.2.2/lib/active_record/associations/association_proxy.rb', line 110 def reload reset load_target self unless @target.nil? end |
#reset ⇒ Object
Resets the loaded flag to false
and sets the target to nil
.
104 105 106 107 |
# File 'lib/gems/activerecord-2.2.2/lib/active_record/associations/association_proxy.rb', line 104 def reset @loaded = false @target = nil end |
#respond_to?(*args) ⇒ Boolean
Does the proxy or its target respond to symbol
?
77 78 79 |
# File 'lib/gems/activerecord-2.2.2/lib/active_record/associations/association_proxy.rb', line 77 def respond_to?(*args) proxy_respond_to?(*args) || (load_target && @target.respond_to?(*args)) end |
#send(method, *args) ⇒ Object
143 144 145 146 147 148 149 150 |
# File 'lib/gems/activerecord-2.2.2/lib/active_record/associations/association_proxy.rb', line 143 def send(method, *args) if proxy_respond_to?(method) super else load_target @target.send(method, *args) end end |
#target ⇒ Object
Returns the target of this proxy, same as proxy_target
.
127 128 129 |
# File 'lib/gems/activerecord-2.2.2/lib/active_record/associations/association_proxy.rb', line 127 def target @target end |
#target=(target) ⇒ Object
Sets the target of this proxy to \target
, and the loaded flag to true
.
132 133 134 135 |
# File 'lib/gems/activerecord-2.2.2/lib/active_record/associations/association_proxy.rb', line 132 def target=(target) @target = target loaded end |