0

我在 Ruby on Rails 中有零个或多个属性的项目(文档)。文档属性有一个类型(“作者”、“发布者”等)。每个文档可以有多个相同类型的属性。

这些目前只是拉出db并列出如下:

<% @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 Cavell, Holborn, London 印刷商:William Cavell
, Holborn, London
卖家:J Barber, Newcastle
卖家:C Etherington, York
卖家:Fletcher and Hodson, Cambridge
卖家:Wilson, Dublin

我正在寻找的是:

出版商:William Cavell, Holborn, London 印刷商:
William Cavell, Holborn, London
卖家:J Barber, Newcastle, C Etherington, York, Fletcher and Hodson, Cambridge, Wilson, Dublin

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

4

2 回答 2

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然后joindoc_attrs数组上。

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

于 2012-08-25T08:01:46.307 回答
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 %>
于 2012-08-25T07:54:48.867 回答