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