如何在ruby中创建复杂的哈希?

时间:2016-07-07 17:16:39

标签: ruby-on-rails ruby json hash

我正在构建使用ElasticSearch的rails应用。我尝试做的是让rails app向客户端发送带有ElasticSearch结果的JSON对象。在哪里可以使用帮助,是如何正确创建发送到Web客户端的对象。

现在,在我的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 个答案:

答案 0 :(得分:1)

不确定您在寻找什么,但我认为这个结构对您来说可能更适合作为JSON对象:

(?i)

这将产生一个看起来像

的结果
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

然后你可以在这个Hash上调用 {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'} ]} ] } 来获取该对象的json字符串。