3

プルしてオブジェクトに読み込むJSONがあります@items

[
 {
  {
    "id": "A",
    "description": "a_description_one"
    "value": some_alphanumeric_string
  }, 
  {
    "id": "B",
    "description": "b_description_one"
    "value": some_alphanumeric_string
  }, 
  {
    "id": "C",
    "description": "c_description_one"
    "value": some_alphanumeric_string
  }
 }, 
 {
  {
    "id": "C",
    "description": "c_description_3"
    "value": some_alphanumeric_string
  }, 
  {
    "id": "A",
    "description": "a_description_3"
    "value": some_alphanumeric_string
  }, 
  {
    "id": "B",
    "description": "b_description_3"
    "value": some_alphanumeric_string
  }
 }, 
 ...
] 

私の目標は、次の2つのテーブルをHTMLで出力することです。

 -----------------------------------------------------
|        A        |        B        |        C        |
|-----------------------------------------------------|
|a_description_one|b_description_one|c_description_one|
|-----------------------------------------------------|
|a_description_two|b_description_two|c_description_two|
|-----------------------------------------------------|
|a_description_3  |b_description_3  |c_description_3  |
 -----------------------------------------------------

そして2番目のテーブル:

 ----------------------------------------------------
|  C value  | C description  |  Count       | Change |
|----------------------------------------------------|
|some string|it's description|times appeared| change |
 ----------------------------------------------------

最初のテーブルはかなり単純ですが、記述子の順序がわからなかったため、コード化するための適切な方法を見つけることができませんでした。そういうものとして、私は持っています:

<table> 
  <thead> 
    <tr>
      <th>a</th>
      ...
    </tr>
  </thead>
  <tbody> 
    <% for item in @items %>
      <% for portion in item %> 
        <% if portion[0]["id"] == "A" %> 
           <% a = portion[0] %>
        <% end %>
      ...
      <% end %> 
      <tr> 
        <td><%= a["description"].to_s %></td>
        ...
      </tr> 
    <% end %>
  </tbody>
</table> 

これはひどいようです。

2番目の表については、すべてのC値を調べ、同じC値を持つ複数の値がある場合はそれらを連結するだけです。また、サーバーから取得してとして持つことができる昨日のデータをロード@items_oldし、同じ値のアイテムの数を昨日のデータと比較したいと思います。これでどこに行けばいいのかわかりません。

4

1 に答える 1

1

説明配列が故障しているように聞こえますが、順番に並べる必要があります。したがって、配列を反復処理する前に、配列を並べ替えるだけです。

<% for item in @items %>
  <% for portion in item.sort_by { |obj| obj['id'] } %> 
    <tr>
      <td><%= obj["description"].to_s %></td>
      ...
    </tr>
  <% end %>
<% end %>

あるいは、ruby配列にArray#findは、ブロックを受け取り、ブロックが。を返すときにアイテムを返すメソッドがありますtrue。したがって、それについて本当に明確にしたい場合は、次のことができます。

<% for item in @items %>
  <% for portion in item %> 
    <tr>
      <td><%= item.find { |obj| obj['id'] == 'A' }["description"].to_s %></td>
      <td><%= item.find { |obj| obj['id'] == 'B' }["description"].to_s %></td>
      <td><%= item.find { |obj| obj['id'] == 'C' }["description"].to_s %></td>
    </tr>
  <% end %>
<% end %>

しかし、それはビューにとってかなり毛むくじゃらになり始めます。そのロジックをいくつかのヘルパーメソッドにリファクタリングすることを強くお勧めします。ここでの欠点はD、そこに突然変更するコードがたくさんあることです。ソートされた配列を反復処理するだけで、そこにいくつあるかを気にする必要はありません。これは、実行している内容に応じて、良い場合と悪い場合があります。


最後に、このデータをルビーで、より希望どおりの形式に変換できます。このデータから新しい配列とハッシュを作成し、処理された@itemsオブジェクトをビューに表示します。または、このデータを解析するメソッドを持ち、その内臓への単純なインターフェイスを提供するクラスにすべてをラップすることをお勧めします。

このデータがかなり複雑で、さまざまな方法で使用されている場合、プレゼンテーションロジックから遠く離れたデータロジックをカプセル化するため、これが最も「正しい」アプローチである可能性があります。

class Descriptions
  def initialize(json)
    @data = JSON.parse(json)
  end

  def get_description(index, id)
    description_obj = @data[index].find do |obj|
      obj['id'] == id
    end

    description_obj['description'].to_s
  end
end

my_model = Descriptions.new(json)
my_model.get_description(0, 'A')
于 2012-07-25T00:30:58.137 に答える