Class: Parse::Object

Inherits:
Hash
  • Object
show all
Defined in:
lib/parse/object.rb

Overview

Represents an individual Parse API object.

Direct Known Subclasses

Installation, Model, User

Instance Attribute Summary collapse

Instance Method Summary collapse

Constructor Details

#initialize(class_name, data = nil) ⇒ Object


16
17
18
19
20
21
22
# File 'lib/parse/object.rb', line 16

def initialize(class_name, data = nil)
  @class_name = class_name
  @op_fields = {}
  if data
    parse data
  end
end

Instance Attribute Details

#class_nameObject (readonly)

Returns the value of attribute class_name


11
12
13
# File 'lib/parse/object.rb', line 11

def class_name
  @class_name
end

#created_atObject (readonly)

Returns the value of attribute created_at


12
13
14
# File 'lib/parse/object.rb', line 12

def created_at
  @created_at
end

#parse_object_idObject (readonly) Also known as: id

Returns the value of attribute parse_object_id


10
11
12
# File 'lib/parse/object.rb', line 10

def parse_object_id
  @parse_object_id
end

#updated_atObject (readonly)

Returns the value of attribute updated_at


13
14
15
# File 'lib/parse/object.rb', line 13

def updated_at
  @updated_at
end

Instance Method Details

#array_add(field, value) ⇒ Object


153
154
155
# File 'lib/parse/object.rb', line 153

def array_add(field, value)
  array_op(field, Protocol::KEY_ADD, value)
end

#array_add_relation(field, value) ⇒ Object


157
158
159
# File 'lib/parse/object.rb', line 157

def array_add_relation(field, value)
  array_op(field, Protocol::KEY_ADD_RELATION, value)
end

#array_add_unique(field, value) ⇒ Object


165
166
167
# File 'lib/parse/object.rb', line 165

def array_add_unique(field, value)
  array_op(field, Protocol::KEY_ADD_UNIQUE, value)
end

#array_remove(field, value) ⇒ Object


169
170
171
# File 'lib/parse/object.rb', line 169

def array_remove(field, value)
  array_op(field, Protocol::KEY_REMOVE, value)
end

#array_remove_relation(field, value) ⇒ Object


161
162
163
# File 'lib/parse/object.rb', line 161

def array_remove_relation(field, value)
  array_op(field, Protocol::KEY_REMOVE_RELATION, value)
end

#decrement(field, amount = 1) ⇒ Object

Decrement the given field by an amount, which defaults to 1. Saves immediately to reflect decremented A synonym for increment(field, -amount).


190
191
192
# File 'lib/parse/object.rb', line 190

def decrement(field, amount = 1)
  increment(field, -amount)
end

#eql?(other) ⇒ Boolean Also known as: ==


24
25
26
# File 'lib/parse/object.rb', line 24

def eql?(other)
  Parse.object_pointer_equality?(self, other)
end

#getObject

make it easier to deal with the ambiguity of whether you're passed a pointer or object


43
44
45
# File 'lib/parse/object.rb', line 43

def get
  self
end

#hashObject


30
31
32
# File 'lib/parse/object.rb', line 30

def hash
  Parse.object_pointer_hash(self)
end

#increment(field, amount = 1) ⇒ Object

Increment the given field by an amount, which defaults to 1. Saves immediately to reflect incremented


174
175
176
177
178
179
180
181
182
183
184
185
186
# File 'lib/parse/object.rb', line 174

def increment(field, amount = 1)
  #value = (self[field] || 0) + amount
  #self[field] = value
  #if [email protected]_object_id
  #  # TODO - warn that the object must be stored first
  #  return nil
  #end

  body = {field => Parse::Increment.new(amount)}.to_json
  data = Parse.client.request(self.uri, :put, body)
  parse data
  self
end

#inspectObject


125
126
127
# File 'lib/parse/object.rb', line 125

def inspect
  "#{@class_name}:#{@parse_object_id} #{super}"
end

#new?Boolean


47
48
49
# File 'lib/parse/object.rb', line 47

def new?
  self["objectId"].nil?
end

#parse_deleteObject

Delete the remote Parse API object.


144
145
146
147
148
149
150
151
# File 'lib/parse/object.rb', line 144

def parse_delete
  if @parse_object_id
    response = Parse.client.delete self.uri
  end

  self.clear
  self
end

#pointerObject


38
39
40
# File 'lib/parse/object.rb', line 38

def pointer
  Parse::Pointer.new(rest_api_hash) unless new?
end

#refreshObject

Update the fields of the local Parse object with the current values from the API.


131
132
133
134
135
136
137
138
139
140
141
# File 'lib/parse/object.rb', line 131

def refresh
  if @parse_object_id
    data = Parse.get @class_name, @parse_object_id
    clear
    if data
      parse data
    end
  end

  self
end

#rest_api_hashObject

full REST api representation of object


100
101
102
# File 'lib/parse/object.rb', line 100

def rest_api_hash
  self.merge(Parse::Protocol::KEY_CLASS_NAME => class_name)
end

#safe_hashObject

representation of object to send on saves


85
86
87
88
89
90
91
92
93
94
95
96
97
# File 'lib/parse/object.rb', line 85

def safe_hash
  Hash[self.map do |key, value|
    if Protocol::RESERVED_KEYS.include?(key)
      nil
    elsif value.is_a?(Hash) && value[Protocol::KEY_TYPE] == Protocol::TYPE_RELATION
      nil
    elsif value.nil?
      [key, Protocol::DELETE_OP]
    else
      [key, Parse.pointerize_value(value)]
    end
  end.compact]
end

#saveObject

Write the current state of the local object to the API. If the object has never been saved before, this will create a new object, otherwise it will update the existing stored object.


59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
# File 'lib/parse/object.rb', line 59

def save
  if @parse_object_id
    method = :put
    self.merge!(@op_fields) # use operations instead of our own view of the columns
  else
    method = :post
  end

  body = safe_hash.to_json
  data = Parse.client.request(self.uri, method, body)

  if data
    # array operations can return mutated view of array which needs to be parsed
    parse Parse.parse_json(class_name, data)
  end

  if @class_name == Parse::Protocol::CLASS_USER
    self.delete("password")
    self.delete(:username)
    self.delete(:password)
  end

  self
end

#should_call_to_h?(value) ⇒ Boolean

Handle the addition of Array#to_h in Ruby 2.1


105
106
107
# File 'lib/parse/object.rb', line 105

def should_call_to_h?(value)
  value.respond_to?(:to_h) && !value.kind_of?(Array)
end

#to_h(*a) ⇒ Object Also known as: as_json, to_hash


109
110
111
112
113
# File 'lib/parse/object.rb', line 109

def to_h(*a)
  Hash[rest_api_hash.map do |key, value|
    [key, should_call_to_h?(value) ? value.to_h : value]
  end]
end

#to_json(*a) ⇒ Object


117
118
119
# File 'lib/parse/object.rb', line 117

def to_json(*a)
  to_h.to_json(*a)
end

#to_sObject


121
122
123
# File 'lib/parse/object.rb', line 121

def to_s
  "#{@class_name}:#{@parse_object_id} #{super}"
end

#update_attributes(data = {}) ⇒ Object


51
52
53
54
# File 'lib/parse/object.rb', line 51

def update_attributes(data={})
  data.each_pair { |k,v| self[k] = v }
  save
end

#uriObject


34
35
36
# File 'lib/parse/object.rb', line 34

def uri
  Protocol.class_uri @class_name, @parse_object_id
end