2017-02-06 13 views
1

私はルビー/レールにはかなり新しいので、私に同行してください。オブジェクト内の値に基づいてREST APIによって返されたオブジェクトをグループ化するにはどうすればよいですか?

私はJIRA rest APIによって返された結果をビューに表示しようとしています。私はjira-ruby gemを使って簡単にそれを行うことができます。私が抱えている問題は、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 %> 

COMPA COMPB

  • IssueA

COMPC COMPD

  • IssueB

コンパCOMPC COMPD

  • IssueC

は私がしたいことは次のとおりです。

COMPA

  • IssueA
  • IssueC

COMPB

  • IssueA

COMPC

  • IssueB
  • IssueC

COMPD

  • IssueB
  • IssueC

APIによって戻されたオブジェクトはかなり入り組んだオブジェクト(すなわちハッシュ内部の配列内にハッシュの巨大な配列)。だから、私はかなり深く、コンポーネント名を取得する必要があります。

私はこのように複雑ではないはずですが、必要以上に複雑にするという酷い習慣があります。私はここで間違って何をしていますか?

EDIT:上記の呼び出しで返される完全ダンプの要点を作成しました。 「コンポーネント」の配列に注目してください:私はあなたが戻ってのJiraから取得しているデータを見ていた

jira-ruby gem dump for all issues

+1

サンプル入力と出力が必要です。 – Anthony

+0

@Anthonyサンプル入力を追加しました。私は何かが欠けていない限り、望ましい出力はすでにそこにありますか?基本的には、コンポーネントに共通するすべての問題をコンポーネント名でグループ化したいと考えています。 –

+0

私はJSONビューアでサンプルデータを見てきましたが、そこに問題があることを示すのに十分ではありません。生の形で見ることができるように、あなたが望む成果を生むデータを含めることができますか?もちろん、私的なデータを難読化するようにしてください。 –

答えて

1

。これは私に見える方法です:

  • Jiraの問題の外側の配列があります。
  • 各問題には「attrs」ハッシュがあります
  • 各「attrs」ハッシュにはコンポーネントが含まれています。

このような理解が正しい場合は、コンポーネントの完全なリストを取得し、それぞれを繰り返し、そのコンポーネントに属する問題を表示できるように、その構造を逆転しようとしています。

その理解が正しければ、次の2つの基本的な選択肢があります。

  • チェックビルド(あなたがそれを自分で生成する必要はありませんので)、その情報のためのJiraを尋ねる、または
  • ことができれば、あなたの(あなたが好むようなローカルDB内のメモリ内の)独自のデータ構造:

メモリ内に有用な構造を構築するためのいくつかのサンプルコード:

# 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> 

注意:一般的な怠惰なプログラマのように、私はこれを試していないが、本当にあなたがおよそ行くかもしれない方法を示すことを意図していますそれ。たとえば、各issueの名前はattrsセクションに埋め込まれているので、少し調べてみる必要があります。

最後に、誰かがこれを便利に見いだす場合は、this to analyse and reformat JSONを使用します。

HTH - 質問がありましたら、コメントを投稿してください。

+0

Danさんに感謝します。これを私の環境にいくつか変更しただけで、#のための未定義のメソッド '[] 'が原因でビューが壊れました。どちらの質問が私のデータベースにAPIからの回答を保存する必要がありますか?私はもともと、それが不必要なステップと思われるので、正しいことではないと考えていました。しかし、リターンデータに作用する複雑さを考えると、おそらくそれはありますか? –

+0

あなたの答えは、私が解決策を構築するのに十分な手がかりを与えました。記録のために、私は現在、これをデータベースに保存していないので、場合によってはAPIを介して私に利用可能な方法で動作するようにソリューションを調整しなければなりませんでした。ご協力いただきありがとうございます! –

+0

助けになるのはうれしい! :) APIソースデータをローカルに(データベース内のサーバー上に)格納するか、毎回取得するかどうかを決めるのは難しいことです。主な課題は、DBデータが最新でなく、リモートで更新されたことを知ることです。 –

関連する問題