我在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中有一种简单的方法吗?我的方法都错了吗?
答案 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 %>