Class: Tire::Results::Item

Inherits:
Object
  • Object
show all
Extended by:
ActiveModel::Naming
Includes:
ActiveModel::Conversion
Defined in:
lib/tire/results/item.rb

Instance Method Summary collapse

Constructor Details

#initialize(args = {}) ⇒ Item

Create new instance, recursively converting all Hashes to Item and leaving everything else alone.

Raises:

  • (ArgumentError)

11
12
13
14
15
16
17
18
19
20
21
# File 'lib/tire/results/item.rb', line 11

def initialize(args={})
  raise ArgumentError, "Please pass a Hash-like object" unless args.respond_to?(:each_pair)
  @attributes = {}
  args.each_pair do |key, value|
    if value.is_a?(Array)
      @attributes[key.to_sym] = value.map { |item| @attributes[key.to_sym] = item.is_a?(Hash) ? Item.new(item.to_hash) : item }
    else
      @attributes[key.to_sym] = value.is_a?(Hash) ? Item.new(value.to_hash) : value
    end
  end
end

Dynamic Method Handling

This class handles dynamic methods through the method_missing method

#method_missing(method_name, *arguments) ⇒ Object

Delegate method to a key in underlying hash, if present, otherwise return +nil+.


25
26
27
# File 'lib/tire/results/item.rb', line 25

def method_missing(method_name, *arguments)
  @attributes[method_name.to_sym]
end

Instance Method Details

#[](key) ⇒ Object Also known as: read_attribute_for_serialization


33
34
35
# File 'lib/tire/results/item.rb', line 33

def [](key)
  @attributes[key.to_sym]
end

#as_json(options = nil) ⇒ Object


75
76
77
78
# File 'lib/tire/results/item.rb', line 75

def as_json(options=nil)
  hash = to_hash
  hash.respond_to?(:with_indifferent_access) ? hash.with_indifferent_access.as_json(options) : hash.as_json(options)
end

#classObject

Let's pretend we're someone else in Rails


87
88
89
90
91
# File 'lib/tire/results/item.rb', line 87

def class
  defined?(::Rails) && @attributes[:_type] ? @attributes[:_type].camelize.constantize : super
rescue NameError
  super
end

#errorsObject


52
53
54
# File 'lib/tire/results/item.rb', line 52

def errors
  ActiveModel::Errors.new(self)
end

#idObject


40
41
42
# File 'lib/tire/results/item.rb', line 40

def id
  @attributes[:_id]   || @attributes[:id]
end

#inspectObject


93
94
95
96
# File 'lib/tire/results/item.rb', line 93

def inspect
  s = []; @attributes.each { |k,v| s << "#{k}: #{v.inspect}" }
  %Q|<Item#{self.class.to_s == 'Tire::Results::Item' ? '' : " (#{self.class})"} #{s.join(', ')}>|
end

#persisted?Boolean


48
49
50
# File 'lib/tire/results/item.rb', line 48

def persisted?
  !!id
end

#respond_to?(method_name, include_private = false) ⇒ Boolean


29
30
31
# File 'lib/tire/results/item.rb', line 29

def respond_to?(method_name, include_private = false)
  (@attributes || {}).has_key?(method_name.to_sym) || super
end

#to_hashObject


64
65
66
67
68
69
70
71
72
73
# File 'lib/tire/results/item.rb', line 64

def to_hash
  @attributes.reduce({}) do |sum, item|
    if item.last.is_a?(Array)
      sum[ item.first ] = item.last.map { |item| item.respond_to?(:to_hash) ? item.to_hash : item }
    else
      sum[ item.first ] = item.last.respond_to?(:to_hash) ? item.last.to_hash : item.last
    end
    sum
  end
end

#to_json(options = nil) ⇒ Object Also known as: to_indexed_json


80
81
82
# File 'lib/tire/results/item.rb', line 80

def to_json(options=nil)
  as_json.to_json(options)
end

#to_keyObject


60
61
62
# File 'lib/tire/results/item.rb', line 60

def to_key
  persisted? ? [id] : nil
end

#typeObject


44
45
46
# File 'lib/tire/results/item.rb', line 44

def type
  @attributes[:_type] || @attributes[:type]
end

#valid?Boolean


56
57
58
# File 'lib/tire/results/item.rb', line 56

def valid?
  true
end