Databasedotcom在Ruby中实现了一个自定义对象

时间:2012-12-10 12:22:03

标签: ruby databasedotcom-gem

我想将SOQL查询的结果作为JSON返回,但数据似乎以字符串形式返回。

client = SFDC_Adapter.login
data = client.query("SELECT  MarkupAmount__c, 
                        MarkupPercent__c,
                        Product_Type_Id__c,
                        Product_Type__c 
                        FROM Product_Type__c 
                        WHERE Product_Type_Id__c = #{product_type_id}")
p data

=> [#<Product_Type__c:0x00000001c356f8 @Id=nil, @OwnerId=nil, @IsDeleted=nil, @Name=nil, @CreatedDate=nil, @CreatedById=nil, @LastModifiedDate=nil, @LastModifiedById=nil, @SystemModstamp=nil, @MarkupPercent__c=5.0, @Subscription__c=nil, @Product_Type__c="Research Trip", @MarkupAmount__c=nil, @Product_Type_Id__c=36.0>]

    puts data
=> #<Product_Type__c:0x00000001c356f8>

    puts data.to_json
=> ["#<Product_Type__c:0x00000001c356f8>"]

如何将这些结果具体化为JSON对象以便在Restful服务中使用?

1 个答案:

答案 0 :(得分:0)

我不知道那个gem,但是通过查看你的输出,并且看一下你的结果,看起来你得到了一个Product_Type个对象。

当您使用pputs时,正在使用inspect,即通过在其上使用HTML编码将实例转换为可在网页中查看的内容。这就是您在输出中看到<>的原因。

相反,您需要访问对象中的值。根据{{​​3}},您可以使用标准的getter或使用hash[key]表单来执行此操作:

contact = Contact.find("contact_id")                #=> #
contact = Contact.find_by_Name("John Smith")        #=> dynamic finders!
contacts = Contact.all                              #=> a Databasedotcom::Collection of Contact instances
contacts = Contact.find_all_by_Company("IBM")       #=> a Databasedotcom::Collection of matching Contacts
contact.Name                                        #=> the contact's Name attribute
contact["Name"]                                     #=> same thing
contact.Name = "new name"                           #=> change the contact's Name attribute, in memory
contact["Name"] = "new name"                        #=> same thing
contact.save                                        #=> save the changes to the database
contact.update_attributes "Name" => "newer name",
  "Phone" => "4156543210"                           #=> change several attributes at once and save them
contact.delete                                      #=> delete the contact from the database

尝试data['Product_Type_Id'],您应该获得36.0。另一种做同样事情的方法是data.Product_Type_Id

一旦找到了访问者,就可以使用简单的散列或散列数组生成JSON。这会产生一个哈希:

require 'json'

hash = {
    'Id'               => data.Id,
    'OwnerId'          => data.OwnerId,
    'IsDeleted'        => data.IsDeleted,
    'Name'             => data.Name,
    'CreatedDate'      => data.CreatedDate,
    'CreatedById'      => data.CreatedById,
    'LastModifiedDate' => data.LastModifiedDate,
    'LastModifiedById' => data.LastModifiedById,
    'SystemModstamp'   => data.SystemModstamp,
    'MarkupPercent'    => data.MarkupPercent,
    'Subscription'     => data.Subscription,
    'Product_Type'     => data.Product_Type,
    'MarkupAmount'     => data.MarkupAmount,
    'Product_Type_Id'  => data.Product_Type_Id,
  }

puts hash.to_json

我没有看到to_hto_hash方法作为捷径。