2016-07-07 3 views
0

Я создаю приложение rails, использующее ElasticSearch. То, что я пытаюсь сделать, - это приложение rails отправить клиенту объект JSON с результатами ElasticSearch. Где я могу использовать справку, как правильно создать объект, который отправляется веб-клиенту.Как создать сложный хэш в рубине?

Прямо сейчас, в моем контроллере rails, я создаю хэш. Является ли хэш правильным способом? Правильно ли я создаю хэш?

# 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 по этому Hash, чтобы получить строку JSON для этого объекта передается обратно.

+0

Это действительно здорово. спасибо – AnnaSm

Смежные вопросы