2017-12-06 9 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

私が持っています フィールド(q、^(​​String.to_existing_atom k)は使用されないため、マップ内のキー値ペアとして使用するリストに変換する – script

+0

@hammadahmedあなたは 'opts_select'の値を使ってあなたの質問に期待される戻り値を追加できますか? – Dogbert

+0

opts_selectには、k = "status_id"があり、kがstatus_idの場合、vは空です。結果は "status_id": "value"になります。 – script

1

%{key: value}構文は、キーとしてハードコーディングされた原子のマップのみのために動作します。動的な値については、1 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

ありがとう、私はそれを試してみます。あなたが複数のフィールドを持っているように、複数の値をselectに渡す方法を提案できますか?** k **表示したい値です。 selectは1つのパラメータしか取らないからです。 – script

+0

私は質問を正しく受け取りませんが、 'select:%{k1 =>フィールド(q、^ k1)、k2 =>フィールド(q、^ k2)}'は行うべきです。 – mudasobwa

+0

これは、** k **がこのような 'list [status_id、first_name、...]'である場合を意味します。私はkで複数のフィールドを持っているので、これらのフィールドを表示するには上記のコードでどのように実装できますか? – script

関連する問題