Class: ActiveFedora::Relation

Inherits:
Object
  • Object
show all
Includes:
Calculations, Delegation, FinderMethods, QueryMethods, SpawnMethods, Enumerable
Defined in:
lib/active_fedora/relation.rb,
lib/active_fedora/relation/merger.rb

Defined Under Namespace

Classes: HashMerger, Merger

Constant Summary

Constants included from Delegation

Delegation::BLACKLISTED_ARRAY_METHODS

Instance Attribute Summary collapse

Instance Method Summary collapse

Methods included from FinderMethods

#exists?, #find, #find_each, #find_in_batches, #find_one, #find_take, #find_with_conditions, #first, #last, #take

Methods included from Calculations

#calculate, #count

Methods included from SpawnMethods

#merge, #merge!, #spawn

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_scopedObject

Returns the value of attribute default_scoped.



7
8
9
# File 'lib/active_fedora/relation.rb', line 7

def default_scoped
  @default_scoped
end

#klassObject

Returns the value of attribute klass.



10
11
12
# File 'lib/active_fedora/relation.rb', line 10

def klass
  @klass
end

#loadedObject (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

#valuesObject

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



65
66
67
68
69
70
71
72
# File 'lib/active_fedora/relation.rb', line 65

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



110
111
112
113
114
115
116
# File 'lib/active_fedora/relation.rb', line 110

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


102
103
104
105
106
107
108
# File 'lib/active_fedora/relation.rb', line 102

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

#resetObject



46
47
48
49
50
# File 'lib/active_fedora/relation.rb', line 46

def reset
  @first = @loaded = nil
  @records = []
  self
end

#scope_for_createObject



126
127
128
# File 'lib/active_fedora/relation.rb', line 126

def scope_for_create
  @scope_for_create ||= where_values_hash.merge(create_with_value)
end

#to_aObject



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_hashObject

Returns a hash of where conditions.

User.where(name: 'Oscar').where_values_hash
# => {name: "Oscar"}


122
123
124
# File 'lib/active_fedora/relation.rb', line 122

def where_values_hash
  {}
end