2012-08-25 82 views
0

我在Ruby on Rails中有零個或多個屬性的項目(文檔)。文檔屬性有一個類型(「作者」,「發佈者」等)。每個文檔可以有多個相同類型的屬性。在Ruby on Rails中分組

這些目前只是拉出數據庫,並列舉如下:

<% @document.attribute_documents.each do |doc_attr| %> 
    <b><%= doc_attr.attribute_type.try(:name) %>: </b> 
    <%= " #{doc_attr.value}" %> 
    <%= ", #{doc_attr.attribute_location}" unless doc_attr.attribute_location.blank? %> 
    <%= ", #{doc_attr.attribute_year}" unless doc_attr.attribute_year.blank? %><br /> 
<% end %> 

其中給出這樣的結果,小於satifactory:

出版商:威廉·卡維爾,霍爾本,倫敦
打印:威廉卡維爾,霍爾本,倫敦
賣方:J Barber,紐卡斯爾
賣方:C Etherington,約克
銷售員:弗萊徹和霍德森,劍橋
賣家:威爾遜,都柏林

我所尋找的是這樣的:

出版商:威廉·卡維爾,霍爾本,倫敦
打印機:威廉·卡維爾,霍爾本倫敦
賣家:J-理髮,紐卡斯爾,C埃瑟林頓,約克,弗萊徹和霍德森,劍橋,威爾遜,都柏林

所以我需要按屬性類型分組,然後循環取決於類型的值。 RoR中有這樣一個簡單的方法嗎?我的方法都錯了嗎?

回答

1

使用Rails的group_by方法:

<% @document.attribute_documents.group_by { |d| d.attribute_type.try(:name) }.each_pair do |type, doc_attrs| 
    <b><%= type %>: </b> 
    <% doc_attrs.each do |doc_attr| %> 
    <%= " #{doc_attr.value}" %> 
    <%= ", #{doc_attr.attribute_location}" unless doc_attr.attribute_location.blank? %> 
    <%= ", #{doc_attr.attribute_year}" unless doc_attr.attribute_year.blank? %><br /> 
    <% end %> 
<% end %> 

沒有測試過這一點,但我認爲它應該工作。

更新:這將在每行中的條目之間省略逗號。我稍後再回來,基本上你需要在doc_attrs陣列上使用map,然後使用join

UPDATE(2):

下面是我一直在尋找的表達,在doc_attrs.each環去:

doc_attrs.map do |doc_attr| 
    [:value, :attribute_location, :attribute_year].map do |attr| 
    doc_attr.send(attr) 
    end.delete_if(&:blank?).join(", ") 
end.join(", ") 

我不使用ERB了,所以不太清楚怎麼翻譯但是,無論如何,創建一個輔助函數並以這種方式構建它可能會更好。

+0

完美 - 非常感謝。 –

0

這樣的事情呢?

<% @document.each do |doc| %> 
    <b><%= doc.try(:name) %>: </b> 
    <%= ", #{doc.location}" unless doc.location.blank? %> 
    <%= ", #{doc.year}" unless doc_attr.year.blank? %><br /> 
    <%= ", #{doc.sellers.join(', '}" %> 
<% end %>