2017-12-30 24 views
1

私はecto 2.2.6を使用しています。ectoと結合するときに選択値を返す方法

私はエクトで参加を控えています。

最初は、Listを使用して単一のテーブルで選択値を返しました。 (1)

次の例では、テーブル結合のためにマップを使用して選択値を返しました。 (2)

Repo.all(from m in "members", 
    left_join: g in "groups", 
      on: g.id == m.group_id, 
     where: g.id == ^group_id 
# select: [:id, :group_id, :name, :group_name] #(1) 
# select: {m.id, m.group_id, m.name, g.group_name} #(2) 
) 

私はHTMLで選択ボックスを作りたいと思います。 マップを使用するとキーがないため動作しません。

<%= select f, :group_id, Enum.map(@groups, &{&1.group_name, &1.group_id}) %> 

選択値を選択して使用するにはどうすればよいですか? 私はectoで選択値を返し、一般的には選択ボックスに含める方法を知っています。

答えて

4

実際には、クエリが実行されるときに2番目の方法ではタプルのリストが生成されます。このドット構文を使ってタプルの要素を取得することはできません。エリクサーの地図リテラルは、私が知る限り、%{}で示されています。したがって、selectを地図に変更すると役立ちます。このような何か:

Repo.all(from m in "members", 
    left_join: g in "groups", 
      on: g.id == m.group_id, 
     where: g.id == ^group_id 
    select: %{ 
     id: m.id, 
     group_id: m.group_id, 
     name: m.name, 
     group_name: g.group_name 
    } 
) 

あなたはちょうど

Repo.all(from m in "members", 
    left_join: g in "groups", 
      on: g.id == m.group_id, 
     where: g.id == ^group_id 
    select: %{ 
     group_id: m.group_id, 
     group_name: g.group_name 
    } 
) 

を行うことができますまたはあなたがちょうどあなたが必要な情報を持つタプルを選択して、直接クエリ結果を渡すことができ、余分なデータを使用していない場合selectタグ

Repo.all(from m in "members", 
    left_join: g in "groups", 
      on: g.id == m.group_id, 
     where: g.id == ^group_id 
    select: {m.group_id, g.group_name} 
) 

# And avoid the Enum.map in the select tag 
<%= select f, :group_id, @groups %> 

に、このためのフェニックスのドキュメントは、あなたが興味あり:https://hexdocs.pm/phoenix_html/Phoenix.HTML.Form.html#select/4

希望します。 =)

+0

#2の場合、マップ%{}またはタプル{}が認識されませんでした。ありがとうございました。非常に役立ちます。 – tajihiro

関連する問題