如何根据 REST API 对象中的值对返回的对象进行分组?

How do I group objects returned by a REST API based on a value inside that object?

我是 ruby/rails 的新手,请多多包涵。

我正在尝试获取由 JIRA rest API 编辑的结果 return 并将它们呈现在视图中。我可以使用 jira-ruby gem 轻松做到这一点。我遇到的问题是通过 return 对象内部的特定对象对结果进行分组 API (在这种情况下, "components" 字段对象内部 "issue" 目的)。我试图为此使用 group_by 和块,但我基本上得到了我想要的相反的结果。两种方法 return 结果相同。

在我的控制器中我有:

@issues = @jira_client.Issue.all

在我看来我有:

<% @issues.chunk {|issue_comp| issue_comp.fields["components"]}.each do |comps, issues| %>
    <h2>
        <% comps.each do |comp| %>
            <%= comp["name"] %>
        <% end %>
    </h2>
    <ul>
        <% issues.each do |issue| %>
            <li><p><%= link_to issue.key, "http://localhost:2990/jira/browse/#{issue.key}" %> - <%= issue.summary %></p></li>
        <% end %>
    </ul>
<% end %>

我最后得到的是:

CompA CompB

CompCCompD

CompA CompC CompD

等等

我想要的是:

CompA

CompB

CompC

CompD

由 API 编辑的对象 return 是一个非常复杂的对象(即散列内部数组中的巨大散列数组)。所以,我必须深入挖掘才能找到组件名称。

我觉得这不应该像看起来那么复杂,但我有一个糟糕的习惯,就是让事情变得比他们需要的更复杂。我在这里做错了什么?

编辑: 我创建了一个完整转储的要点,该转储是 return 使用上述调用编辑的。注意 "components" 数组:

jira-ruby gem dump for all issues

我查看了您从 Jira 返回的数据。在我看来是这样的:

  • 有一个 Jira 问题的外部数组。
  • 每个问题都有一个 "attrs" 散列
  • 每个 "attrs" 散列包含组件。

如果这种理解是正确的,我认为您正在尝试反转该结构,以便您可以获得完整的组件列表,然后遍历每个组件,并显示属于该组件的问题。

如果这种理解是正确的,您有两个基本选择:

  • 检查您是否可以向 Jira 询问该信息(这样您就不必自己生成),或者
  • 构建您自己的数据结构(根据您的喜好在内存中或本地数据库中):

构建有用结构的示例代码in-memory:

# in a controller, model, or service class (as you wish)
@components = {}
@jira_issues_array.each do |jira_issue| # from your API call
  jira_issues[:components].each do |jira_component|
    @components[jira_component[:key]] ||= { name: jira_component[:name], issue_keys: [] }
    @components[jira_component[:key]][:issue_keys] << jira_issue[:key]
  end
end

在您看来,您可以像这样迭代@components:

# some html.erb file:
<h1>Components and Issues</h1>

<ul>
  <% @components.keys.each do |component_key, component| %>
    <li><%= component[:name] %>
      <ul> <!-- nested -->
        <% component[:issue_keys].each do |issue_key| %>
          <%= @jira_issues_array.find { |issue| issue[:key] == issue_key }[:name] %>
        <% end %>
      </ul>
    </li>
  <% end %>
</ul>

注意:就像一个典型的懒惰程序员一样,我还没有尝试过这个,但它确实是为了向您展示如何去做。例如,每个问题的名称都嵌入在 attrs 部分,因此您需要稍微挖掘一下。

最后,如果有人觉得这有用,我会使用 this to analyse and reformat JSON

HTH - 如有任何疑问或问题,post 发表评论。