2016-07-07 97 views
0

我正在構建使用ElasticSearch的Rails應用程序。我想要做的是讓Rails應用程序向客戶端發送帶有ElasticSearch結果的JSON對象。在哪裏我可以使用幫助,是如何正確地創建發送到Web客戶端的對象。如何在ruby中創建一個複雜的哈希?

現在,在我的軌道控制器中,我創建了一個散列。散列正確的路要走嗎?我是否正確創建散列?

# Get the search results 
@documents = current_user.documents.search(params[:q], current_user.id) 

# Create the HASH 
if @documents.count > 0 
    @documents.aggregations.by_authentication_id.buckets.each_with_index do |bucket, index| 
    # Create buckets 
    @json[ :buckets ][ index ] = {} 
    @json[ :buckets ][ index ][ :key ] = bucket["key"] 
    @json[ :buckets ][ index ][ :documents ] = {} 
    bucket["by_top_hit"].hits.hits.each_with_index do |d,i| 
     @json[ :buckets ][ index ][ :documents ][i] = { 
      title: d._source.document_title, 
      snippet: d.text 
     } 
    end 
end 

logger.debug @json 

我是否正確創建對象?我期待着學習如何正確/最佳地做到這一點。我很欣賞的意見,建議等..謝謝

回答

1

不能確定你在找什麼,但是我覺得作爲一個JSON對象這種結構可能是你更好:

json = {} 
json[:buckets] = @documents.aggregations.by_authentication_id.buckets.map do |bucket| 

    { 
    key: bucket["key"], 
    documents: bucket["by_top_hit"].hits.hits.map do |doc| 
        { title: doc._source.document_title, 
        snippet: doc.text 
        } 
       end 
    } 
end 

這將產生一個結果,看起來像

{buckets: [ 
      {key: 'bucket_key', 
      documents: [ 
        {title: 'Some Title', 
        snippet: 'snippet'}, 
        {title: 'Some Title2', 
        snippet: 'snippet2'} 
      ]}, 
      {key: 'bucket_key2', 
      documents: [ 
        {title: 'Some Title3', 
        snippet: 'snippet3'}, 
        {title: 'Some Title4', 
        snippet: 'snippet4'} 
      ]} 
     ] 
    } 

然後,你可以調用.to_json這個哈希以獲取該對象被傳遞迴JSON字符串。

+0

這真的很棒。謝謝 – AnnaSm