在Ruby on Rails上进行分组

时间:2012-08-25 07:25:37

标签: 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 %>

这给出了这样的结果,不太令人满意:

出版商:William Cave,伦敦霍尔本 打印机:William Cavell,Holborn,伦敦 卖方:J Barber,Newcastle
卖方:C Etherington,York
卖方:Fletcher和Hodson,剑桥 卖方:威尔逊,都柏林

我正在寻找的是:

出版商:William Cave,伦敦霍尔本 打印机:William Cavell,Holborn,伦敦 卖家:J Barber,Newcastle,C Etherington,York,Fletcher和Hodson,Cambridge,Wilson,Dublin

所以我需要对属性类型进行分组,然后根据类型循环遍历值。在RoR中有一种简单的方法吗?我的方法都错了吗?

2 个答案:

答案 0 :(得分: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 %>

没有对此进行测试,但我认为它应该可行。

更新:这将在每行的条目之间省略逗号。我稍后会再回过头来看,基本上你需要在map数组上使用join然后doc_attrs

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了,所以不太确定如何翻译它,但无论如何都可能更好地创建一个辅助函数并以这种方式构建它。

答案 1 :(得分: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 %>