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_one, #find_take, #first, #last, #search_by_id, #search_in_batches, #search_with_conditions, #take

Methods included from Calculations

#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



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

#eachObject



147
148
149
150
151
152
153
154
155
# File 'lib/active_fedora/relation.rb', line 147

def each
  if loaded?
    @records.each { |item| yield item } if block_given?
    @records.to_enum
  else
    find_each(where_values) { |item| yield item } if block_given?
    enum_for(:find_each, where_values)
  end
end

#empty?Boolean

Returns:

  • (Boolean)


157
158
159
# File 'lib/active_fedora/relation.rb', line 157

def empty?
  !any?
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



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

#scopingObject

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_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"}


139
140
141
# File 'lib/active_fedora/relation.rb', line 139

def where_values_hash
  {}
end