Ruby on rails 如何根据RESTAPI返回的对象内部的值对该对象进行分组?

Ruby on rails 如何根据RESTAPI返回的对象内部的值对该对象进行分组?,ruby-on-rails,ruby,grouping,jira-rest-api,Ruby On Rails,Ruby,Grouping,Jira Rest Api,我对ruby/rails还很陌生,所以请容忍我 我试图获取jirarestapi返回的结果,并在视图中呈现它们。我可以很容易地用宝石做到这一点。我遇到的问题是,在API返回的对象(在本例中是“issue”对象中的“components”字段对象)中,通过特定对象对结果进行分组。我曾尝试使用group_by和chunk来实现这一点,但我基本上得到了我想要的相反结果。两个方法返回相同的结果 在我的控制器中,我有: @issues = @jira_client.Issue.all 我认为: <

我对ruby/rails还很陌生,所以请容忍我

我试图获取jirarestapi返回的结果,并在视图中呈现它们。我可以很容易地用宝石做到这一点。我遇到的问题是,在API返回的对象(在本例中是“issue”对象中的“components”字段对象)中,通过特定对象对结果进行分组。我曾尝试使用group_by和chunk来实现这一点,但我基本上得到了我想要的相反结果。两个方法返回相同的结果

在我的控制器中,我有:

@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 %>

  • -

我最终得到的是:

公司

  • 伊塞亚
CompC CompD

  • 问题B
CompA CompC CompD

  • 伊塞克
等等

我想要的是:

公司

  • 伊塞亚
  • 伊塞克
康普

  • 伊塞亚
康普

  • 问题B
  • 伊塞克
康普德

  • 问题B
  • 伊塞克
API返回的对象是一个非常复杂的对象(即哈希数组中的巨大哈希数组)。因此,我必须深入挖掘才能找到组件名称

我觉得事情不应该像看上去那么复杂,但我有一个可怕的习惯,就是把事情弄得比实际需要的复杂。我做错了什么

EDIT:我创建了与上述调用一起返回的完整转储的要点。请注意“组件”数组:


我看了一下你从吉拉那里得到的数据。在我看来是这样的:

  • 还有一系列外部的Jira问题
  • 每个问题都有一个“attrs”散列
  • 每个“attrs”散列都包含组件
如果这种理解是正确的,我认为您正在尝试反转该结构,以便获得完整的组件列表,然后迭代每个组件,并显示属于该组件的问题

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

  • 检查您是否可以向Jira索要该信息(这样您就不必自己生成),或者
  • 构建您自己的数据结构(在内存中,在本地数据库中,根据您的喜好):
在内存中构建有用结构的一些示例代码:

# 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
控制器、模型或服务类中的
#(如您所愿)
@组件={}
@jira_issues|数组。每个do|jira_issues|35;都来自您的API调用
jira_问题[:组件]。每个do | jira_组件|
@组件[jira_组件[:键]]| |={名称:jira_组件[:名称],发布_键:[]]

@组件[jira_component[:key][:issue_key]我们需要样本输入和所需的输出。@Anthony我已经添加了样本输入。期望的输出已经存在,除非我遗漏了什么?基本上,我想根据视图中的组件名称对组件的所有常见问题进行分组。我在JSON查看器中查看了您的示例数据,但没有足够的数据来说明您遇到的问题。您是否可以将生成所需结果的数据包括在内,以便我们可以看到它的原始形式?当然,一定要混淆你的私人数据。@DanLaffan对不起,你是对的。我创建了一个完整转储的要点。我清理了它的私有数据,但实际上没有,因为它都在开发环境中。谢谢Dan!我只做了几次修改就把它放到了我的环境中,由于#的未定义方法“[]”,我的视图被破坏了。这就引出了一个问题,我应该将API的响应存储在数据库中吗?我原本认为这不是正确的做法,因为这似乎是不必要的一步。然而,考虑到对返回数据采取行动的复杂性,也许是这样?您的回答为我提供了足够的线索来构建解决方案。作为记录,我目前没有将其存储在我的数据库中,因此我必须调整我的解决方案,以便在某些情况下使用API提供给我的方法。谢谢你的帮助!很高兴能帮上忙!:)无论是在本地(在服务器上的数据库中)存储API源数据,还是每次都去获取这些数据,都是一个困难的问题。主要的挑战是知道您的数据库数据何时过期并被远程更新。
# 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>