Class: DatastaxRails::Associations::CollectionProxy
- Defined in:
- lib/datastax_rails/associations/collection_proxy.rb
Overview
Association proxies in DatastaxRails 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 DatastaxRails::Reflection::AssociationReflection.
For example, given
class Blog < DatastaxRails::Base
has_many :posts
end
blog = Blog.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 DatastaxRails::Associations::HasManyAssociation.
The @target
object is not loaded until needed. For example,
blog.posts.count
is computed directly through Solr and does not trigger by itself the instantiation of the actual post records.
Instance Attribute Summary collapse
-
#association ⇒ Object
(also: #proxy_association)
readonly
:nodoc:.
Instance Method Summary collapse
- #<<(*records) ⇒ Object (also: #push)
-
#===(other) ⇒ Object
Forwards
===
explicitly to the target because the instance method removal above doesn’t catch it. - #clear ⇒ Object
-
#initialize(association) ⇒ CollectionProxy
constructor
A new instance of CollectionProxy.
- #method_missing(method, *args, &block) ⇒ Object
- #reload ⇒ Object
- #respond_to?(name, include_private = false) ⇒ Boolean
- #to_ary ⇒ Object (also: #to_a)
Constructor Details
#initialize(association) ⇒ CollectionProxy
Returns a new instance of CollectionProxy.
50 51 52 53 |
# File 'lib/datastax_rails/associations/collection_proxy.rb', line 50 def initialize(association) @association = association Array.wrap(association.[:extend]).each { |ext| proxy_extend(ext) } end |
Dynamic Method Handling
This class handles dynamic methods through the method_missing method
#method_missing(method, *args, &block) ⇒ Object
63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 |
# File 'lib/datastax_rails/associations/collection_proxy.rb', line 63 def method_missing(method, *args, &block) if target.respond_to?(method) || (!proxy_association.klass.respond_to?(method) && Class.respond_to?(method)) if load_target if target.respond_to?(method) target.send(method, *args, &block) else begin super rescue NoMethodError => e raise e, e..sub(/ for #<.*$/, " via proxy for #{target}") end end end else scoped.send(method, *args, &block) end end |
Instance Attribute Details
#association ⇒ Object (readonly) Also known as: proxy_association
:nodoc:
37 38 39 |
# File 'lib/datastax_rails/associations/collection_proxy.rb', line 37 def association @association end |
Instance Method Details
#<<(*records) ⇒ Object Also known as: push
93 94 95 |
# File 'lib/datastax_rails/associations/collection_proxy.rb', line 93 def <<(*records) proxy_association.concat(records) && self end |
#===(other) ⇒ Object
Forwards ===
explicitly to the target because the instance method removal above doesn’t catch it. Loads the target if needed.
84 85 86 |
# File 'lib/datastax_rails/associations/collection_proxy.rb', line 84 def ===(other) other === load_target # rubocop:disable Style/CaseEquality end |
#clear ⇒ Object
98 99 100 101 |
# File 'lib/datastax_rails/associations/collection_proxy.rb', line 98 def clear destroy_all self end |
#reload ⇒ Object
103 104 105 106 |
# File 'lib/datastax_rails/associations/collection_proxy.rb', line 103 def reload proxy_association.reload self end |
#respond_to?(name, include_private = false) ⇒ Boolean
57 58 59 60 61 |
# File 'lib/datastax_rails/associations/collection_proxy.rb', line 57 def respond_to?(name, include_private = false) super || (load_target && target.respond_to?(name, include_private)) || proxy_association.klass.respond_to?(name, include_private) end |
#to_ary ⇒ Object Also known as: to_a
88 89 90 |
# File 'lib/datastax_rails/associations/collection_proxy.rb', line 88 def to_ary load_target.dup end |