我想知道是否可以在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>
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
包装在我为此答案创建的模块中,但您可以将它放在您认为合适的任何模块中。
你当然可以!
你可以像这样去做,假设你有这样的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)
的函数中添加它们