2017-12-30 48 views
1

나는 ecto 2.2.6을 사용하고 있습니다.ecto와 결합 할 때 선택 값을 반환하는 방법

저는 외부로 가입하려고합니다.

처음에는 List를 사용하여 단일 테이블로 선택 값을 반환했습니다. (1)

다음으로 테이블 조인 때문에 선택 값을 반환하기 위해 Map을 사용했습니다. (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로 select 값을 반환하고 일반적으로 select 상자에 recive하는 방법을 알고 싶습니다.

답변

4

사실 두 번째 방법은 쿼리가 실행될 때 튜플 목록을 생성합니다. 튜플 구문을 사용하여 튜플 요소를 가져올 수 없습니다. 엘릭서의지도 리터럴은 내가 아는 한 %{}으로 표시됩니다. 따라서 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