首页 > 解决方案 > 是否可以合并两个单独的 ecto 查询?

问题描述

我想知道是否可以将两个查询组合在一起。

我想创建一个函数,它接受 ecto 查询并根据情况对其进行修改。

例如,假设我们有一个users允许usernames输入重复项的表,并且用户创建了以下查询...

query = from(u in "users", select: u)
select_all_unique_users(query)

我希望该select_all_unique_users函数采用query并添加到它,以便它只选择不同的用户名。

这只是一个例子,我知道我可以unique_index在桌子上创建一个来避免这种情况=D

作为query引擎盖下的结构,我想我可以更新distinct密钥来做到这一点。这似乎可行,但缺点是它似乎不是很灵活,而且如果我想添加更复杂的逻辑,看起来很难实现。

简而言之,我想做的是创建一个接受查询并向其添加更多逻辑的函数......

iex()> query = from(u in "users", select: u)
#Ecto.Query<from u0 in "users", select: u0>

iex()> select_all_unique_users(query)
#Ecto.Query<from u0 in "users", distinct: [asc: u0.username], select: u0>

标签: elixirecto

解决方案


select_all_unique_users 函数将像这样实现:

defmodule TestModule do
  def select_all_unique_users(q) do
    from u in q, distinct: u.username
  end
end

你可以像下面这样使用它:

iex(2)> query = from(u in "users", select: u)
#Ecto.Query<from u in "users", select: u>

iex(3)> distinct = TestModule.select_all_unique_users(query)
#Ecto.Query<from u in "users", distinct: [asc: u.username], select: u>

我包装select_all_unique_users了我为此答案创建的模块,但是您可以将其放置在您认为合适的任何模块中。


推荐阅读