0

Ruby on Railsに、属性がゼロまたは多数あるアイテム(ドキュメント)があります。document属性にはタイプ(「作成者」、「発行者」など)があります。各ドキュメントは、同じタイプの複数の属性を持つことができます。

これらは現在、データベースから取り出され、次のようにリストされています。

<% @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、ホルボーン、ロンドン
プリンター:William Cavell、ホルボーン、ロンドン
売り手:J Barber、ニューカッスル
売り手:C Etherington、ヨーク
売り手:Fletcher and Hodson、ケンブリッジ
売り手:Wilson、ダブリン

私が探しているのはこれです:

出版社:William Cavell、ホルボーン、ロンドン
プリンター:William Cavell、ホルボーン、ロンドン
販売者:J Barber、Newcastle、C Etherington、York、Fletcher and Hodson、Cambridge、Wilson、Dublin

したがって、属性タイプでグループ化してから、タイプに応じて値をループする必要があります。RoRでこれを行う簡単な方法はありますか?私のアプローチはすべて間違っていますか?

4

2 に答える 2

1

レールの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を使用していないので、それをどのように翻訳するかはよくわかりませんが、とにかくヘルパー関数を作成してそのように構築する方が良いでしょう。

于 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 に答える