Class: Mongoid::Association::Referenced::HasMany::Proxy
- Defined in:
- lib/mongoid/association/referenced/has_many/proxy.rb
Overview
This class defines the behaviour for all relations that are a one-to-many between documents in different collections.
Direct Known Subclasses
Mongoid::Association::Referenced::HasAndBelongsToMany::Proxy
Instance Attribute Summary
Attributes inherited from Proxy
#_association, #_base, #_target
Class Method Summary collapse
- .eager_loader(association, docs) ⇒ Object
-
.embedded? ⇒ false
Returns true if the relation is an embedded one.
Instance Method Summary collapse
-
#<<(*args) ⇒ Array<Document>
(also: #push)
Appends a document or array of documents to the relation.
-
#build(attributes = {}, type = nil) {|doc| ... } ⇒ Document
(also: #new)
Build a new document from the attributes and append it to this relation without saving.
-
#concat(documents) ⇒ Array<Document>
Appends an array of documents to the relation.
-
#delete(document) ⇒ Document
Delete the document from the relation.
-
#delete_all(conditions = nil) ⇒ Integer
Deletes all related documents from the database given the supplied conditions.
-
#destroy_all(conditions = nil) ⇒ Integer
Destroys all related documents from the database given the supplied conditions.
-
#each ⇒ Array<Document>
Iterate over each document in the relation and yield to the provided block.
-
#exists? ⇒ true, false
Determine if any documents in this relation exist in the database.
-
#find(*args) ⇒ Document, Criteria
Find the matchind document on the association, either based on id or conditions.
-
#initialize(base, target, association) ⇒ Proxy
constructor
Instantiate a new references_many relation.
-
#nullify ⇒ Object
(also: #nullify_all)
Removes all associations between the base document and the target documents by deleting the foreign keys and the references, orphaning the target documents in the process.
-
#purge ⇒ Many
(also: #clear)
Clear the relation.
-
#substitute(replacement) ⇒ Many
Substitutes the supplied target documents for the existing documents in the relation.
-
#unscoped ⇒ Criteria
Get a criteria for the documents without the default scoping applied.
Methods inherited from Many
#blank?, #create, #create!, #find_or_create_by, #find_or_create_by!, #find_or_initialize_by, #nil?, #respond_to?, #scoped, #serializable_hash
Methods inherited from Proxy
apply_ordering, #extend_proxies, #init, #klass, #reset_unloaded, #substitutable
Methods included from Marshalable
Constructor Details
#initialize(base, target, association) ⇒ Proxy
Instantiate a new references_many relation. Will set the foreign key and the base on the inverse object.
212 213 214 215 216 217 |
# File 'lib/mongoid/association/referenced/has_many/proxy.rb', line 212 def initialize(base, target, association) enum = HasMany::Targets::Enumerable.new(target, base, association) init(base, enum, association) do raise_mixed if klass. && !klass.cyclic? end end |
Dynamic Method Handling
This class handles dynamic methods through the method_missing method
#method_missing(name, *args, &block) ⇒ Criteria, Object (private)
If the target array does not respond to the supplied method then try to find a named scope or criteria on the class and send the call there.
If the method exists on the array, use the default proxy behavior.
436 437 438 439 440 441 442 443 444 |
# File 'lib/mongoid/association/referenced/has_many/proxy.rb', line 436 def method_missing(name, *args, &block) if _target.respond_to?(name) _target.send(name, *args, &block) else klass.send(:with_scope, criteria) do criteria.public_send(name, *args, &block) end end end |
Class Method Details
.eager_loader(association, docs) ⇒ Object
557 558 559 |
# File 'lib/mongoid/association/referenced/has_many/proxy.rb', line 557 def eager_loader(association, docs) Eager.new(association, docs) end |
.embedded? ⇒ false
Returns true if the relation is an embedded one. In this case always false.
570 571 572 |
# File 'lib/mongoid/association/referenced/has_many/proxy.rb', line 570 def false end |
Instance Method Details
#<<(*args) ⇒ Array<Document> Also known as: push
Appends a document or array of documents to the relation. Will set the parent and update the index in the process.
31 32 33 34 35 36 37 38 39 |
# File 'lib/mongoid/association/referenced/has_many/proxy.rb', line 31 def <<(*args) docs = args.flatten return concat(docs) if docs.size > 1 if doc = docs.first append(doc) doc.save if persistable? && !_assigning? && !doc.validated? end self end |
#build(attributes = {}, type = nil) {|doc| ... } ⇒ Document Also known as: new
Build a new document from the attributes and append it to this relation without saving.
77 78 79 80 81 82 83 84 |
# File 'lib/mongoid/association/referenced/has_many/proxy.rb', line 77 def build(attributes = {}, type = nil) doc = Factory.build(type || klass, attributes) append(doc) doc.apply_post_processed_defaults yield(doc) if block_given? doc.run_callbacks(:build) { doc } doc end |
#concat(documents) ⇒ Array<Document>
Appends an array of documents to the relation. Performs a batch insert of the documents instead of persisting one at a time.
54 55 56 57 58 59 60 61 62 63 |
# File 'lib/mongoid/association/referenced/has_many/proxy.rb', line 54 def concat(documents) docs, inserts = [], [] documents.each do |doc| next unless doc append(doc) save_or_delay(doc, docs, inserts) if persistable? end persist_delayed(docs, inserts) self end |
#delete(document) ⇒ Document
Delete the document from the relation. This will set the foreign key on the document to nil. If the dependent options on the relation are :delete or :destroy the appropriate removal will occur.
100 101 102 103 104 105 106 107 108 109 |
# File 'lib/mongoid/association/referenced/has_many/proxy.rb', line 100 def delete(document) execute_callback :before_remove, document _target.delete(document) do |doc| if doc unbind_one(doc) cascade!(doc) if !_assigning? end execute_callback :after_remove, doc end end |
#delete_all(conditions = nil) ⇒ Integer
Deletes all related documents from the database given the supplied conditions.
125 126 127 |
# File 'lib/mongoid/association/referenced/has_many/proxy.rb', line 125 def delete_all(conditions = nil) remove_all(conditions, :delete_all) end |
#destroy_all(conditions = nil) ⇒ Integer
Destroys all related documents from the database given the supplied conditions.
143 144 145 |
# File 'lib/mongoid/association/referenced/has_many/proxy.rb', line 143 def destroy_all(conditions = nil) remove_all(conditions, :destroy_all) end |
#each ⇒ Array<Document>
This will load the entire relation into memory.
Iterate over each document in the relation and yield to the provided block.
160 161 162 163 164 165 166 |
# File 'lib/mongoid/association/referenced/has_many/proxy.rb', line 160 def each if block_given? _target.each { |doc| yield(doc) } else to_enum end end |
#exists? ⇒ true, false
Determine if any documents in this relation exist in the database.
174 175 176 |
# File 'lib/mongoid/association/referenced/has_many/proxy.rb', line 174 def exists? criteria.exists? end |
#find(*args) ⇒ Document, Criteria
This will keep matching documents in memory for iteration later.
Find the matchind document on the association, either based on id or conditions.
195 196 197 198 199 |
# File 'lib/mongoid/association/referenced/has_many/proxy.rb', line 195 def find(*args) matching = criteria.find(*args) Array(matching).each { |doc| _target.push(doc) } matching end |
#nullify ⇒ Object Also known as: nullify_all
Removes all associations between the base document and the target documents by deleting the foreign keys and the references, orphaning the target documents in the process.
227 228 229 230 231 232 233 |
# File 'lib/mongoid/association/referenced/has_many/proxy.rb', line 227 def nullify criteria.update_all(foreign_key => nil) _target.clear do |doc| unbind_one(doc) doc.changed_attributes.delete(foreign_key) end end |
#purge ⇒ Many Also known as: clear
Clear the relation. Will delete the documents from the db if they are already persisted.
246 247 248 249 250 251 252 253 254 255 256 257 258 259 260 261 262 263 264 265 |
# File 'lib/mongoid/association/referenced/has_many/proxy.rb', line 246 def purge unless _association.destructive? nullify else after_remove_error = nil criteria.delete_all many = _target.clear do |doc| execute_callback :before_remove, doc unbind_one(doc) doc.destroyed = true begin execute_callback :after_remove, doc rescue => e after_remove_error = e end end raise after_remove_error if after_remove_error many end end |
#substitute(replacement) ⇒ Many
Substitutes the supplied target documents for the existing documents in the relation. If the new target is nil, perform the necessary deletion.
281 282 283 284 285 286 287 288 289 290 291 292 293 294 |
# File 'lib/mongoid/association/referenced/has_many/proxy.rb', line 281 def substitute(replacement) if replacement new_docs, docs = replacement.compact, [] new_ids = new_docs.map { |doc| doc._id } remove_not_in(new_ids) new_docs.each do |doc| docs.push(doc) if doc.send(foreign_key) != _base.send(_association.primary_key) end concat(docs) else purge end self end |
#unscoped ⇒ Criteria
Get a criteria for the documents without the default scoping applied.
305 306 307 |
# File 'lib/mongoid/association/referenced/has_many/proxy.rb', line 305 def unscoped klass.unscoped.where(foreign_key => _base.send(_association.primary_key)) end |