lib/databasedotcom/client.rb in databasedotcom-1.1.7 vs lib/databasedotcom/client.rb in databasedotcom-1.2.0
- old
+ new
@@ -410,28 +410,51 @@
_module || Object
end
def collection_from(response)
response = JSON.parse(response)
- array_response = response.is_a?(Array)
+ collection_from_hash( response )
+ end
+
+ # Converts a Hash of object data into a concrete SObject
+ def record_from_hash(data)
+ attributes = data.delete('attributes')
+ new_record = find_or_materialize(attributes["type"]).new
+ data.each do |name, value|
+ field = new_record.description['fields'].find do |field|
+ key_from_label(field["label"]) == name || field["name"] == name || field["relationshipName"] == name
+ end
+
+ # Field not found
+ if field == nil
+ break
+ end
+
+ # If reference/lookup field data was fetched, recursively build the child record and apply
+ if value.is_a?(Hash) and field['type'] == 'reference' and field["relationshipName"]
+ relation = record_from_hash( value )
+ set_value( new_record, field["relationshipName"], relation, 'reference' )
+
+ # Apply the raw value for all other field types
+ else
+ set_value(new_record, field["name"], value, field["type"]) if field
+ end
+ end
+ new_record
+ end
+
+ def collection_from_hash(data)
+ array_response = data.is_a?(Array)
if array_response
- records = response.collect { |rec| self.find(rec["attributes"]["type"], rec["Id"]) }
+ records = data.collect { |rec| self.find(rec["attributes"]["type"], rec["Id"]) }
else
- records = response["records"].collect do |record|
- attributes = record.delete('attributes')
- new_record = find_or_materialize(attributes["type"]).new
- record.each do |name, value|
- field = new_record.description['fields'].find do |field|
- key_from_label(field["label"]) == name || field["name"] == name
- end
- set_value(new_record, field["name"], value, field["type"]) if field
- end
- new_record
+ records = data["records"].collect do |record|
+ record_from_hash( record )
end
end
- Databasedotcom::Collection.new(self, array_response ? records.length : response["totalSize"], array_response ? nil : response["nextRecordsUrl"]).concat(records)
+ Databasedotcom::Collection.new(self, array_response ? records.length : data["totalSize"], array_response ? nil : data["nextRecordsUrl"]).concat(records)
end
def set_value(record, attr, value, attr_type)
value_to_set = value
@@ -490,10 +513,10 @@
end
def query_org_id
query("select id from Organization")[0]["Id"]
end
-
+
def const_defined_in_module(mod, const)
mod.method(:const_defined?).arity == 1 ? mod.const_defined?(const) : mod.const_defined?(const, false)
end
end
end