2016-02-29 54 views
-2

我有以下表導軌 - 如何遍歷陣列中的散列來顯示HTML表格數據(數組的值在一個表格單元格去爲每個陣列)

<table> 
    <tr> 
     <% @table_header.each do |key, value| %> 

     <th> <%= value %></th> 

     <% end %> 
    <tr> 
<% @item_id.each do |item_id| %> 
    <tr> 

     <% @table_content.each do |key, content| %> 
     <!-- line below is the main focus --> 
     <td> <%= CategoryItemValue.find_by(key: content, category_item_id: item_id).try(:value) %></td> 
     <% end %> 

    <tr> 
     <% end %> 
</table > 

該表顯示內容來自DB。你可以忽略頭,它工作正常,並形成一個哈希。我的問題是表格數據。

items具有不同的values組,並且給每組值賦予唯一的密鑰,例如,關鍵'顏色'將抓住該項目的顏色值。這種設置能正常工作正常哈希像下面

normal_hash = {"key1"=>"color", "key2"=>"speed", "key3"=>"weight", "key4"=>"height"} 

一個有了,如果你有normal_hash更換@table_content上面的表格它會正常工作,並顯示每個項目,顏色,速度等。

但現在我想有這樣的散列

new_hash = {"key1"=>["color", "age"], "key2"=>"speed", "key3"=>["weight", "brand"], "key4"=>"height"} 

因此,我可以在一個表格單元而不是一個顯示2個值。我不知道如何循環遍歷散列中的數組作爲值的數組,同時保持兩個值在一個表格單元格中。

你可以看到我目前如何做到這一點,通過調用數據庫.find_by,併爲key:分配散列值,然後爲該表格單元格獲取正確的項目值。如果散列值是一個數組,那麼我需要它再次爲該行運行此行td。所以一個單元格可以顯示一個項目的多個值。如何才能做到這一點?

希望是有道理的。如果其更容易我可以具有所有的散列值是數組(但大多數將具有陣列中的一個值)

更新

基本上形式以上通過正常散列把一個值在每個表格單元循環(I作爲正常散列的示例,作爲normal_hash)。這個循環是從這些線路進行(與normal_hash取代@table_content

<% @table_content.each do |key, content| %> 
      <!-- line below is the main focus --> 
      <td> <%= CategoryItemValue.find_by(key: content, category_item_id: item_id).try(:value) %></td> 
      <% end %> 

我就需要遍歷像new_hash(而不是像normal_hash有數組作爲哈希值,哈希散列。因此,它可以有不止表中的單元格一個值

+1

我發現很難跟蹤你想要做什麼以及你的要求。我認爲你應該重新格式化你的問題,使其更清楚 – MilesStanfield

回答

0

如果你把所有的值數組作爲你提到你的問題的最後它會更容易的你可以用你的陣列join,就像這樣:。

CategoryItemValue.find_by(key: content, category_item_id: item_id).try(:value).try(:join, ', ') 

這將在單元格中放置一個以逗號分隔的值列表(如果希望不同行上的項目或需要的分隔符,請將','替換爲「\ n」)。

如果你不想改變散列,你需要檢查你的值是否爲Array;一種方法是:CategoryItemValue.find_by(key: content, category_item_id: item_id).try(:value).try(:is_a?, Array)。那麼如果它是一個數組,則使用join,如果不是,則直接使用該值。

+0

感謝您的答案。我將它們全部更改爲數組,但它似乎沒有做任何事情。當我添加'.try(:join,',')'時,它將表格單元留空。沒有'.try(:join,',')'當前設置我顯示數組中的第一個值 – Rob

+0

您可以在控制檯中嘗試嗎?最終如果你知道這個值總是存在的並且總是一個數組,你可以擺脫這兩種'try'方法。 – taglia

+0

呃我不知道如何在控制檯中輸入多行代碼(在這種情況下循環)。該值將始終是一個數組,但不總是存在。 – Rob

0

你的問題: 我不知道如何遍歷散列中的數組作爲值的數組,而同時保持兩個值在一個表格單元格中。

您需要創建一個變量來存儲散列數組值。在示例中, 存儲KEY1值

new_hash = {"key1"=>["color", "age"], "key2"=>"speed", "key3"=>["weight", "brand"], "key4"=>"height"} 
key1_arr = new_hash["key1"] #this is to get key1 array 
if(key1_arr.class = "Array") #see type of object 
    key1_arr.each do |val_key1| 
    ..your ..logic ..for array.. ..here 
    end 
else 
    ..your ..logic ..for ..non ..array 
end 
+0

好吧,並保存在做這個邏輯讓我說讓我所有的陣列。我將如何循環訪問數組值,以便它們全部顯示在一個表格單元格中。目前在我的問題中的設置,它只顯示數組中的第一個值。 – Rob

+0

把這一行放在循環部分 'CategoryItemValue.find_by(key:content,category_item_id:item_id).try(:value)' –

+0

但這隻適用於第一個鍵。散列中的鍵數不是一個集合數,所以我不能爲所有鍵硬編碼數組,並且硬編碼表使'keyx_arr.each do | val_key1 | '爲每列。 – Rob

0

我在散列製成的每個值的陣列

new_hash = {"key1"=>["color", "age"], "key2"=>["speed"], "key3"=>["weight", "brand"], "key4"=>["height"]}

我然後有new_hash循環內部循環來循環通過陣列內<td>標籤。

<% new_hash.each do |key, content| %> 

    <td><p> 
    <% content.each do |key_value| %> 
     <%= CategoryItemValue.find_by(key: key_value, category_item_id: item_id).try(:value) %>, 
    <% end %> 
    <p></td> 

    <% end %>