Elixir
Phoenix

2つのリストをキーと値のmapとしてマージする

Enum.into()は、リストをマージするのに、なかなか便利に使える

defmodule MapList do
    def zip( list1, list2 ), do: Enum.into( List.zip( [ list1, list2 ] ), %{} )
end

たとえば、Ectoで直接select文を流した後の結果は、columnsというリストと、rowsというリストのリストで別々のアイテムで返ってくるが、この2つをマージして、columnsの各値をキーとするmap_listに変換することができる

Ecto.Adapters.SQL.query( Livery.Repo, sql, [] )
|> Tpl.ok
|> rows 
|> Enum.map( &( MapList.zip( columns( result ), &1 ) ) )

これをPhoenixのindex.html.eexなんかでforで回すと、けっこう便利な書き方ができる

<table>
<tr>
<%= for caption <- map_list |> List.first |> Map.keys() do %>
    <th><%= caption %></th>
<% end %>
</tr>
<tr>
<%= for record <- map_list do %>
    <%= for column <- record |> Map.keys() do %>
    <td><%= record[ column ] %></td>
    <% end %>
<% end %>
</tr>
</table>

なお、列に日時型があると、上記のままではエラーになってしまうので、日時タプルから文字列への変換をしてあげる