是否可以合并两个单独的ecto查询?

时间:2019-02-12 18:38:01

标签: elixir ecto

我想知道是否可以在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>

2 个答案:

答案 0 :(得分:1)

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包裹在为这个答案而创建的模块中,但是您可以将其放在您认为合适的任何模块中。

答案 1 :(得分:1)

当然可以!

假设您有一个select_all_unique_users/1函数,您可以这样处理:

def select_all_unique_users(query) do
  from(u in query, distinct: u.username)
end

应该可以解决问题。因此,您可以这样做:

# using a defined User schema is preferred over "users". Using
# "users" might cause an error for not being able to sellect all fields
# from table without a schema

iex> q = from(u in User, select: u)
#Ecto.Query<from u in User, select: u>
iex> select_all_unique_users(q)
#Ecto.Query<from u in User, distinct: [asc: u.username], select: u>
  

请注意,来自select_all_unique_users/1的查询没有其他select语句。这是因为仅允许一个select表达式。因此,如果您想在不同的查询中选择不同的属性,则可能需要在select_all_unique_users/1或其他基于from(u in User)

的函数中添加它