2016-07-07 12 views
0

Ich baue eine Rails-App, die ElasticSearch verwendet. Was ich versuche, ist, dass die Rails-App dem Client ein JSON-Objekt mit den ElasticSearch-Ergebnissen sendet. Wo kann ich Hilfe verwenden? Wie erstellt man das Objekt, das an den Webclient gesendet wird?Wie erstellt man einen komplexen Hash in Ruby?

Im Moment, in meinem Rails Controller, erstelle ich einen Hash. Ist Hash der richtige Weg? Erstelle ich den Hash korrekt?

# 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 

Erstelle ich das Objekt korrekt? Ich suche, wie man das richtig/optimal macht. Ich schätze die Ratschläge, Tipps etc ... Danke

Antwort

1

nicht wirklich sicher, was Sie suchen, aber ich denke, diese Struktur für Sie sein könnte schöner als JSON-Objekt:

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 

Dies wird ein produzieren Ergebnis, das wie

{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'} 
      ]} 
     ] 
    } 

sieht Dann können Sie rufen Sie einfach .to_json auf dieser Hash den jSON-String für dieses Objekt weitergegeben wird zurück zu bekommen.

+0

Das ist wirklich großartig. Vielen Dank – AnnaSm