2013-10-11 35 views
3

我有一個名爲「產品」的數據庫,其中有一個字段使用名爲data的hstore。動態顯示一個html表中的哈希數組?

此刻,在我index.html.haml,我只是通過產品循環和展示他們data作爲哈希:

- @products.each do |product| 
    =product.data #THIS PRINTS A HASH 
    %hr 

其中,例如,可以打印一個散列,如:

{"Name"=>"Example","type"=>"book", "price"=>"7.99"} 

我想製作一個HTML表格,它可以容納動態數量的鍵和值,並將它們打印到與鍵值對應的列中。這裏有一個圖:

enter image description here

感謝所有幫助!

回答

5

希望這可以幫助:

解決方案1:基於過時的

條件相同。數據內容#:

  • 所有product.data有對鍵的相同數量的/值。
  • 所有產品的配對順序是相同的。

的代碼:

# headers 
%tr 
    - @products.first.data.keys.each do |attribute_name| 
    %th= attribute_name 
# body 
- @products.each do |product| 
    %tr 
    - product.data.attributes.each do |attribute_value| 
     %td= attribute_value 

此代碼將正確呈現如果每個product.data有鍵/值對相同量的並存儲在相同的順序。


解決方案2:完全動態的(不同的.data)#推薦

條件:

  • product.data的雙(鍵/ val的)的數目之間的變化的每個產品
  • 所有產品的配對順序都不相同。

代碼:

# we gather all possible attribute's name in the data hash: 
- headers = @products.map(&:data).flat_map(&:keys).uniq 

%tr 
    # we make a table-head cell for each attribute's name: 
    - headers.each do |key| 
    %th= key 

- @products.each do |product| 
    %tr # for each attribute's name, we display a TD cell and try to display it's value if exists 
    - headers.each do |key| 
     %td= product.data[key] 

隨意詢問詳情,我覺得像我剛纔給你不由分說的一段代碼...

+0

感謝這麼多的回答!它可能產品數據不會總是有相同數量的鍵/值對。你能發佈代碼嗎? – infinity

+0

@infinity我剛剛更新了我的答案;) – MrYoshiji

+1

非常感謝!我剛剛google了flat_map(),所以非常感謝你向我介紹一個新功能! – infinity