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



166
167
168
169
170
171
172
173
# File 'lib/active_fedora/relation.rb', line 166

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).



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

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

#count(*args) ⇒ Object

Get a count of the number of objects from solr Takes :conditions as an argument



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

def count(*args)
  return apply_finder_options(args.first).count  if args.any?
  opts = {}
  opts[:rows] = @limit_value if @limit_value
  opts[:sort] = @order_values if @order_values
  
  query = @where_values.present? ? @where_values : {}
  @klass.calculate :count, query, opts

end

#delete_all(conditions = nil) ⇒ Object



213
214
215
216
217
218
219
# File 'lib/active_fedora/relation.rb', line 213

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


205
206
207
208
209
210
211
# File 'lib/active_fedora/relation.rb', line 205

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

  • args (Hash)

    a customizable set of options

Options Hash (*args):

  • :rows (Integer)

    when :all is passed, the maximum number of rows to load from solr

  • :cast (Boolean)

    when true, examine the model and cast it to the first known cModel



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

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



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

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

#find_with_ids(ids, cast) ⇒ Object



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

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



175
176
177
# File 'lib/active_fedora/relation.rb', line 175

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



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

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