2016-07-07 9 views
0

私はElasticSearchを使用しているレールアプリを構築しています。私がしようとしているのは、レールアプリがクライアントにJSONオブジェクトをElasticSearchの結果で送信させることです。ヘルプを使用できる場所は、Webクライアントに送信されるオブジェクトを適切に作成する方法です。ルビーで複雑なハッシュを作成するには?

今、私のレールコントローラで、私はハッシュを作成しています。ハッシュは正しい方法ですか?ハッシュを正しく作成していますか?

# 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 

オブジェクトを正しく作成していますか?私はこれを最適に/最適にする方法を学びたいと思っています。

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 

これが生成されます:私は、あなたが探しているが、私はこのような構造は、JSONオブジェクトとしてあなたのためのよりよいかもしれないと思うものを

答えて

1

本当にわからないありがとう...アドバイス、ヒントなどを高く評価します次に、あなただけ戻って渡されるこのオブジェクトのJSON文字列を取得するには、このハッシュに.to_jsonを呼び出すことができます

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

のように見える結果。

+0

これは本当に素晴らしいです。ありがとうございました – AnnaSm

関連する問題