2016-05-06 11 views
-1

のグループ詳細項目:フェニックス - テンプレートの次を考える

[ 
    {"2016-05-06T08:59:50", "Woke up"}, 
    {"2016-05-06T09:30:20", "Ate breakfast"}, 
    {"2016-05-07T01:48:10", "Went to bed"} 
] 

私は、Webページに(上記)詳細行を表示するには好きですが、日によってグループ化したい:

<h1>6 May 2016</h1> 
8:59 - Woke up 
9:30 - Ate breakfast 

<h1>7 May 2016</h1> 
1:48 - Went to bed 

Phoenixでは、テンプレートを使用してこれを行うにはどうすればよいでしょうか?テンプレートにレンダリングする前に、Ectoクエリの結果をコントローラの親/子データ構造に変換するのが最善でしょうか?もしそうなら、私はテンプレートにネストされたループを使用しますか?

答えて

2

することはできEnum.group_by/3を使用して、日付グループ:以下になり

Enum.group_by(dates, fn {date, _} -> Ecto.Date.cast!(date) end) 

:後、あなたはおそらくそれらを並べ替える必要がありますので、しかし

%{#Ecto.Date<2016-05-06> => [{"2016-05-06T09:30:20", "Ate breakfast"}, 
    {"2016-05-06T08:59:50", "Woke up"}], 
    #Ecto.Date<2016-05-07> => [{"2016-05-07T01:48:10", "Went to bed"}]} 

は、マップは、注文データタイプではありません使用::

Enum.group_by(dates, fn {date, _} -> Ecto.Date.cast!(date) end) |> Enum.sort() 

[{#Ecto.Date<2016-05-06>, 
    [{"2016-05-06T09:30:20", "Ate breakfast"}, 
    {"2016-05-06T08:59:50", "Woke up"}]}, 
{#Ecto.Date<2016-05-07>, [{"2016-05-07T01:48:10", "Went to bed"}]}] 

テンプレートshoul以下のようなものを見dは:group_byリストに頭を付加することでリストを作成しますので、我々はここにリストを反転

<%= for {date, events} <- @dates do %> 
    <h1><%= date %></h1> 
    <%= for event <- Enum.reverse(events) do %> 
    <%= event %> 
    <% end %> 
<% end %> 

注意、これはあります。

+1

偉大な答え。また、このコードを置くのに最適な場所はテンプレートでもコントローラーでもなく、ビューでもあると付け加えます。 – tkowal

+0

詳細を教えてください。コントローラの目的はデータを翻訳することだと思いましたか? – Mitkins

関連する問題