Class: ActiveFedora::Relation

Inherits:
Object
  • Object
show all
Defined in:
lib/active_fedora/relation.rb

Instance Attribute Summary collapse

Instance Method Summary collapse

Constructor Details

#initialize(klass) ⇒ Relation

Returns a new instance of Relation.



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

def initialize(klass)
  @klass = klass
  @loaded = false
  self.where_values = []
  self.order_values = []
end

Instance Attribute Details

#limit_valueObject

Returns the value of attribute limit_value.



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

def limit_value
  @limit_value
end

#loadedObject (readonly) Also known as: loaded?

Returns the value of attribute loaded.



4
5
6
# File 'lib/active_fedora/relation.rb', line 4

def loaded
  @loaded
end

#order_valuesObject

Returns the value of attribute order_values.



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

def order_values
  @order_values
end

#where_valuesObject

Returns the value of attribute where_values.



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

def where_values
  @where_values
end

Instance Method Details

#==(other) ⇒ Object



152
153
154
155
156
157
158
159
# File 'lib/active_fedora/relation.rb', line 152

def ==(other)
  case other
  when Relation
    other.where_values == where_values
  when Array
    to_a == other
  end
end

#all(*args) ⇒ Object

A convenience wrapper for find(:all, *args). You can pass in all the same arguments to this method as you can to find(:all).



134
135
136
# File 'lib/active_fedora/relation.rb', line 134

def all(*args)
  args.any? ? apply_finder_options(args.first).to_a : to_a
end

#delete_all(conditions = nil) ⇒ Object



199
200
201
202
203
204
205
# File 'lib/active_fedora/relation.rb', line 199

def delete_all(conditions = nil)
  if conditions
    where(conditions).delete_all
  else
    to_a.each {|object| object.delete }.tap { reset }
  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


191
192
193
194
195
196
197
# File 'lib/active_fedora/relation.rb', line 191

def destroy_all(conditions = nil)
  if conditions
    where(conditions).destroy_all
  else
    to_a.each {|object| object.destroy }.tap { reset }
  end
end

#find(*args) ⇒ Object

Returns an Array of objects of the Class that find is being called on

@param args either a pid or :all or a hash of conditions

Parameters:

  • opts (Hash)

    the options to create a message with.



85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
# File 'lib/active_fedora/relation.rb', line 85

def find(*args)
  return to_a.find { |*block_args| yield(*block_args) } if block_given?
  options = args.extract_options!

  # TODO is there any reason not to cast?
  cast = options.delete(:cast)
  if options[:sort]
    # Deprecate sort sometime?
    sort = options.delete(:sort) 
    options[:order] ||= sort if sort.present?
  end

  if options.present?
    options = args.first unless args.empty?
    options = {conditions: options}
    apply_finder_options(options).all
  else
    case args.first
    when :first, :last, :all
      send(args.first)
    else
      find_with_ids(args, cast)
    end
  end
end

#find_some(ids, cast) ⇒ Object



128
129
130
# File 'lib/active_fedora/relation.rb', line 128

def find_some(ids, cast)
  ids.map{|id| @klass.find_one(id, cast)}
end

#find_with_ids(ids, cast) ⇒ Object



111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
# File 'lib/active_fedora/relation.rb', line 111

def find_with_ids(ids, cast)
  expects_array = ids.first.kind_of?(Array)
  return ids.first if expects_array && ids.first.empty?

  ids = ids.flatten.compact.uniq

  case ids.size
  when 0
    raise ArgumentError, "Couldn't find #{@klass.name} without an ID"
  when 1
    result = @klass.find_one(ids.first, cast)
    expects_array ? [ result ] : result
  else
    find_some(ids, cast)
  end
end

#firstObject

Returns the first records that was found.

Examples:

Person.where(name_t: 'Jones').first
  => #<Person @id="foo:123" @name='Jones' ... >


28
29
30
31
32
33
34
# File 'lib/active_fedora/relation.rb', line 28

def first
  if loaded?
    @records.first
  else
    @first ||= limit(1).to_a[0]
  end
end

#inspectObject



161
162
163
# File 'lib/active_fedora/relation.rb', line 161

def inspect
  to_a.inspect
end

#limit(value) ⇒ Object

Limits the number of returned records to the value specified

Examples:

Person.where(name_t: 'Jones').limit(10)
  => [#<Person @id="foo:123" @name='Jones'>, #<Person @id="foo:125" @name='Jones'>, ...]

Parameters:

  • [Integer] (Hash)

    a customizable set of options



43
44
45
46
47
# File 'lib/active_fedora/relation.rb', line 43

def limit(value)
  relation = clone
  relation.limit_value = value
  relation
end

#order(*args) ⇒ Object

Order the returned records by the field and direction provided

Examples:

Person.where(occupation_s: 'Plumber').order('name_t desc', 'color_t asc')
  => [#<Person @id="foo:123" @name='Luigi'>, #<Person @id="foo:125" @name='Mario'>, ...]

Parameters:

  • [Array<String>] (Hash)

    a customizable set of options



70
71
72
73
74
75
76
# File 'lib/active_fedora/relation.rb', line 70

def order(*args)
  return self if args.blank?

  relation = clone
  relation.order_values += args.flatten
  relation
end

#resetObject



16
17
18
19
20
# File 'lib/active_fedora/relation.rb', line 16

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

#to_aObject



140
141
142
143
144
145
146
147
148
149
150
# File 'lib/active_fedora/relation.rb', line 140

def to_a
  return @records if loaded?
  args = {} #:cast=>true}
  args[:rows] = @limit_value if @limit_value
  args[:sort] = @order_values if @order_values
  
  query = @where_values.present? ? @where_values : {}
  @records = @klass.to_enum(:find_each, query, args).to_a

  @records
end

#where(opts) ⇒ Object

Limits the returned records to those that match the provided search conditions

Examples:

Person.where(name_t: 'Mario', occupation_s: 'Plumber')
  => [#<Person @id="foo:123" @name='Mario'>, #<Person @id="foo:125" @name='Mario'>, ...]

Parameters:

  • [Hash] (Hash)

    a customizable set of options



56
57
58
59
60
61
# File 'lib/active_fedora/relation.rb', line 56

def where(opts)
  return self if opts.blank?
  relation = clone
  relation.where_values = opts
  relation
end