Warning: file_get_contents(/data/phpspider/zhask/data//catemap/7/elixir/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Elixir 在EXTO查询中构建自定义select_Elixir_Ecto - Fatal编程技术网

Elixir 在EXTO查询中构建自定义select

Elixir 在EXTO查询中构建自定义select,elixir,ecto,Elixir,Ecto,我正在使用Phoenix和Ecto 2.0构建一个应用程序,该应用程序在多个模型中存储大量数据 我希望允许用户执行查询并仅选择所有字段的子集 我已经能够让标准完美地工作(在这方面,与我预期的相比,使用CTO要容易得多;这是开发人员的一大支柱!),但是我还没有弄清楚如何选择东西 我的初始查询如下所示: query = from e in Event, left_join: t in assoc(e, :event_type), left_join: r in assoc(e,

我正在使用Phoenix和Ecto 2.0构建一个应用程序,该应用程序在多个模型中存储大量数据

我希望允许用户执行查询并仅选择所有字段的子集

我已经能够让标准完美地工作(在这方面,与我预期的相比,使用CTO要容易得多;这是开发人员的一大支柱!),但是我还没有弄清楚如何选择东西

我的初始查询如下所示:

query =
  from e in Event,
    left_join: t in assoc(e, :event_type),
    left_join: r in assoc(e, :event_reason_code),
    left_join: o in assoc(e, :event_outcome_code),
    left_join: i in assoc(e, :item),
    left_join: l in assoc(e, :location),
    left_join: c in assoc(l, :client)
我希望能够动态地分配一个select

现在,我看到的是:

["event.id", "client.name", ...]
然后,我根据第一个句点之前的内容进行模式匹配,然后构建SQL以选择适当的字段

我试着这样做是为了让你了解我想要实现的目标:

defp build_selects(query, event_query) do
  select query, [e, t, r, o, i, l, c], Enum.reduce(event_query.select, {}, fn(key, acc) ->
    field =
      case key do
        "event.info." <> rest -> fragment("?->>?", field(e, :info), String.to_atom(rest))
        "event." <> rest -> field(e, String.to_atom(rest))
        "event_type." <> rest -> field(t, String.to_atom(rest))
        "event_reason_code." <> rest -> field(r, String.to_atom(rest))
        "event_outcome_code." <> rest -> field(o, String.to_atom(rest))
        "item.info." <> rest -> fragment("?->>?", field(i, :info), String.to_atom(rest))
        "item." <> rest -> field(i, String.to_atom(rest))
        "location.info." <> rest -> fragment("?->>?", field(l, :info), String.to_atom(rest))
        "location." <> rest -> field(l, String.to_atom(rest))
        "client.info." <> rest -> fragment("?->>?", field(c, :info), String.to_atom(rest))
        "client." <> rest -> field(c, String.to_atom(rest))
      end

    Tuple.append acc, field
  end)
end
这似乎也不完全有效,因为必须至少有一个字段,否则它会出错。

对于“至少有一个字段,否则它会出错”的问题,我将在函数中构建指定select的元组。该函数将检查以确保选择了某个列。如果调用方未指定有效列,则应返回错误。然后,您可以决定如何处理调用者中的错误

from [e, t, r, o, i, l, c] in query,
  select: {take(e, ^Map.get(s_map, :event, [])),
           take(t, ^Map.get(s_map, :event_type, [])),
           take(r, ^Map.get(s_map, :event_reason_code, [])),
           take(o, ^Map.get(s_map, :event_outcome_code, [])),
           take(i, ^Map.get(s_map, :item, [])),
           take(l, ^Map.get(s_map, :location, [])),
           take(c, ^Map.get(s_map, :client, []))}