2017-12-06 11 views
0

지도를 프런트 엔드에 보내려고합니다. 아래의 코드처럼 원자에 키를 넣으면 잘 동작합니다.SELECT 맵의 값을 설정하십시오.

defp build_select(queryable, opts_select) do 
    if opts_select == nil do 
    queryable 
    else 
    Enum.reduce opts_select, queryable, fn ({k, v}, queryable) -> 
     a = from q in queryable, 
     select: %{Data: field(q, ^(String.to_existing_atom k))} 

    end 
    end 
end 

하지만 데이터 대신 k 값을 보내려고합니다. 내가 어떻게 그럴 수 있니? K는 문자열입니다.

k 값을 원자로 변환하고 사용했지만 작동하지 않았습니다.

답변

0

보간 된 필드 목록과 함께 map을 사용할 수 있습니다.

select_list = Enum.map(opts_select, fn {k, _v} -> String.to_existing_atom(k) end) 

from q in queryable, 
select: map(q, ^select_list) 
+0

내가 가진 field (q,^(String.to_existing_atom k))가지도에서 키 값 쌍으로 사용하기 때문에 목록으로 변환 – script

+0

@hammadahmed'opts_select'의 예제 값을 사용하여 예상되는 반환 값을 질문에 추가 할 수 있습니까? – Dogbert

+0

k가 status_id 인 경우 opts_select에서 i는 k = "status_id"이고 v가 비어 있으면 결과는 "status_id": "value"가됩니다. – script

1

%{key: value} 구문은 키와 하드 원자에 대한지도 작동합니다. 동적 값를 들어, 하나의 should use the hashrocket syntax는 :

이 작동하지 않습니다

key = :foo 
%{key: :bar} 
#⇒ %{key: :bar} 

을이 것 :

key = :foo 
%{key => :bar} 
#⇒ %{foo: :bar} # NOTE :foo as a key 

따라서, 귀하의 예제로 다시 전환 :

- select: %{Data: field(q, ^(String.to_existing_atom k))} 

+ key = String.to_existing_atom k 
+ select: %{k => field(q, ^k)} 
+0

감사합니다. 내가 여러 필드를 가지고있는 것처럼 선택에서 여러 값을 전달할 수있는 방법을 제안 할 수 있습니까 ** k ** 표시하고 싶습니다. select는 하나의 매개 변수만을 취하기 때문에 – script

+0

질문을 잘 모르겠지만'% {k1 => field (q,^k1), k2 => field (q,^k2)}'가해야합니다. – mudasobwa

+0

** ** k **가 이와 같이'list [status_id, first_name, ...]'인 경우를 의미합니다. k에 여러 필드가 있으므로 위의 코드에서이 필드를 표시하려면 어떻게해야합니까? – script