Class: ActiveFedora::Relation
- Inherits:
-
Object
- Object
- ActiveFedora::Relation
- Includes:
- Calculations, Delegation, FinderMethods, QueryMethods, SpawnMethods, Enumerable
- Defined in:
- lib/active_fedora/relation.rb,
lib/active_fedora/relation/merger.rb
Direct Known Subclasses
AssociationRelation, Associations::CollectionProxy, FileRelation
Defined Under Namespace
Classes: HashMerger, Merger
Constant Summary
Constants included from Delegation
Delegation::BLACKLISTED_ARRAY_METHODS
Instance Attribute Summary collapse
-
#default_scoped ⇒ Object
Returns the value of attribute default_scoped.
-
#klass ⇒ Object
Returns the value of attribute klass.
-
#loaded ⇒ Object
(also: #loaded?)
readonly
Returns the value of attribute loaded.
-
#values ⇒ Object
Returns the value of attribute values.
Instance Method Summary collapse
- #==(other) ⇒ Object
-
#create(*args, &block) ⇒ Object
Tries to create a new record with the same scoped attributes defined in the relation.
- #delete_all(conditions = nil) ⇒ Object
-
#destroy_all(conditions = nil) ⇒ Object
Destroys the records matching
conditions
by instantiating each record and calling itsdestroy
method. -
#initialize(klass, _values = {}) ⇒ Relation
constructor
A new instance of Relation.
-
#initialize_copy(_other) ⇒ Object
This method gets called on clone.
- #reset ⇒ Object
- #scope_for_create ⇒ Object
-
#scoping ⇒ Object
Scope all queries to the current scope.
- #to_a ⇒ Object
-
#where_values_hash ⇒ Object
Returns a hash of where conditions.
Methods included from FinderMethods
#exists?, #find, #find_each, #find_one, #find_take, #first, #last, #search_by_id, #search_in_batches, #search_with_conditions, #take
Methods included from Calculations
Methods included from SpawnMethods
Methods included from QueryMethods
#build_where, #create_with_value, #extending!, #extending_values, #extending_values=, #limit, #limit!, #limit_value, #limit_value=, #none!, #offset, #offset!, #offset_value, #offset_value=, #order, #order!, #order_values, #order_values=, #select, #where, #where!, #where_values, #where_values=
Constructor Details
#initialize(klass, _values = {}) ⇒ Relation
Returns a new instance of Relation.
12 13 14 15 16 |
# File 'lib/active_fedora/relation.rb', line 12 def initialize(klass, _values = {}) @klass = klass @loaded = false @values = {} end |
Dynamic Method Handling
This class handles dynamic methods through the method_missing method in the class ActiveFedora::Delegation
Instance Attribute Details
#default_scoped ⇒ Object
Returns the value of attribute default_scoped.
7 8 9 |
# File 'lib/active_fedora/relation.rb', line 7 def default_scoped @default_scoped end |
#klass ⇒ Object
Returns the value of attribute klass.
10 11 12 |
# File 'lib/active_fedora/relation.rb', line 10 def klass @klass end |
#loaded ⇒ Object (readonly) Also known as: loaded?
Returns the value of attribute loaded.
6 7 8 |
# File 'lib/active_fedora/relation.rb', line 6 def loaded @loaded end |
#values ⇒ Object
Returns the value of attribute values.
10 11 12 |
# File 'lib/active_fedora/relation.rb', line 10 def values @values end |
Instance Method Details
#==(other) ⇒ Object
82 83 84 85 86 87 88 89 |
# File 'lib/active_fedora/relation.rb', line 82 def ==(other) case other when Relation other.where_values == where_values when Array to_a == other end end |
#create(*args, &block) ⇒ Object
Tries to create a new record with the same scoped attributes defined in the relation. Returns the initialized object if validation fails.
Expects arguments in the same format as Base.create
.
Examples
users = User.where(name: 'Oscar')
users.create # #<User id: 3, name: "oscar", ...>
users.create(name: 'fxn')
users.create # #<User id: 4, name: "fxn", ...>
users.create { |user| user.name = 'tenderlove' }
# #<User id: 5, name: "tenderlove", ...>
users.create(name: nil) # validation on name
# #<User id: nil, name: nil, ...>
42 43 44 |
# File 'lib/active_fedora/relation.rb', line 42 def create(*args, &block) scoping { @klass.create(*args, &block) } end |
#delete_all(conditions = nil) ⇒ Object
127 128 129 130 131 132 133 |
# File 'lib/active_fedora/relation.rb', line 127 def delete_all(conditions = nil) if conditions where(conditions).delete_all else to_a.each(&:delete).tap { reset }.size end end |
#destroy_all(conditions = nil) ⇒ Object
Destroys the records matching conditions
by instantiating each record and calling its destroy
method. Each object’s callbacks are executed (including :dependent
association options and before_destroy
/after_destroy
Observer methods). Returns the collection of objects that were destroyed; each will be frozen, to reflect that no changes should be made (since they can’t be persisted).
Note: Instantiation, callback execution, and deletion of each record can be time consuming when you’re removing many records at once. It generates at least one fedora DELETE
query per record (or possibly more, to enforce your callbacks). If you want to delete many rows quickly, without concern for their associations or callbacks, use delete_all
instead.
Parameters
-
conditions
- A string, array, or hash that specifies which records to destroy. If omitted, all records are destroyed. See the Conditions section in the ActiveFedora::Relation#where for more information.
Examples
Person.destroy_all(:status_s => "inactive")
Person.where(:age_i => 18).destroy_all
119 120 121 122 123 124 125 |
# File 'lib/active_fedora/relation.rb', line 119 def destroy_all(conditions = nil) if conditions where(conditions).destroy_all else to_a.each(&:destroy).tap { reset }.size end end |
#initialize_copy(_other) ⇒ Object
This method gets called on clone
19 20 21 22 23 |
# File 'lib/active_fedora/relation.rb', line 19 def initialize_copy(_other) # Dup the values @values = Hash[@values] reset end |
#reset ⇒ Object
46 47 48 49 50 |
# File 'lib/active_fedora/relation.rb', line 46 def reset @first = @loaded = nil @records = [] self end |
#scope_for_create ⇒ Object
143 144 145 |
# File 'lib/active_fedora/relation.rb', line 143 def scope_for_create @scope_for_create ||= where_values_hash.merge(create_with_value) end |
#scoping ⇒ Object
Scope all queries to the current scope.
Comment.where(post_id: 1).scoping do
Comment.first
end
# => SELECT "comments".* FROM "comments" WHERE "comments"."post_id" = 1 ORDER BY "comments"."id" ASC LIMIT 1
Please check unscoped if you want to remove all previous scopes (including the default_scope) during the execution of a block.
74 75 76 77 78 79 80 |
# File 'lib/active_fedora/relation.rb', line 74 def scoping previous = klass.current_scope klass.current_scope = self yield ensure klass.current_scope = previous end |
#to_a ⇒ Object
52 53 54 55 56 57 58 59 60 61 62 63 |
# File 'lib/active_fedora/relation.rb', line 52 def to_a return @records if loaded? args = @klass == ActiveFedora::Base ? { cast: true } : {} args[:rows] = limit_value if limit_value args[:start] = offset_value if offset_value args[:sort] = order_values if order_values @records = to_enum(:find_each, where_values, args).to_a @loaded = true @records end |
#where_values_hash ⇒ Object
Returns a hash of where conditions.
User.where(name: 'Oscar').where_values_hash
# => {name: "Oscar"}
139 140 141 |
# File 'lib/active_fedora/relation.rb', line 139 def where_values_hash {} end |