Create new instance, recursively converting all Hashes to Item and leaving everything else alone.
# 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
# File lib/tire/results/item.rb, line 33 def [](key) @attributes[key.to_sym] end
# 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
Let's pretend we're someone else in Rails
# File lib/tire/results/item.rb, line 87 def class defined?(::Rails) && @attributes[:_type] ? @attributes[:_type].camelize.constantize : super rescue NameError super end
# File lib/tire/results/item.rb, line 52 def errors ActiveModel::Errors.new(self) end
# File lib/tire/results/item.rb, line 40 def id @attributes[:_id] || @attributes[:id] end
# 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
Delegate method to a key in underlying hash, if present, otherwise return
nil
.
# File lib/tire/results/item.rb, line 25 def method_missing(method_name, *arguments) @attributes[method_name.to_sym] end
# File lib/tire/results/item.rb, line 48 def persisted? !!id end
# 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
# 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
# File lib/tire/results/item.rb, line 80 def to_json(options=nil) as_json.to_json(options) end
# File lib/tire/results/item.rb, line 60 def to_key persisted? ? [id] : nil end
# File lib/tire/results/item.rb, line 44 def type @attributes[:_type] || @attributes[:type] end
# File lib/tire/results/item.rb, line 56 def valid? true end