2012-08-25 96 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 %>