Ecto 查询中的条件参数
Conditional parameters in an Ecto Query
我有一个可选的参数platform
:
def query_clicks(freq \ "day", platform \ false) do
from(Click)
|> select(
[c],
[
fragment("date_trunc(?,?) as t", ^freq, c.inserted_at), count(c.link_id) ]
)
|> if platform, do: fn(q) -> where([c], c.platform == ^platform) end, else: fn(q): q end
|> group_by([c], fragment("t"))
|> Repo.all
end
我试图破解一些东西(参见 "if platform..."),但我不确定要使用的确切语法。我想做的是:
if platform != None:
return query + WHERE statement
else:
return query
正确的语法是什么?
您可以添加一个额外的功能maybe_platform/2
defp maybe_platform(queryable, nil), do: queryable
defp maybe_platform(queryable, platform) do
queryable
|> where([c], c.platform == ^platform)
end
那么你的query_clicks/2
看起来像
def query_clicks(freq \ "day", platform \ false) do
from(Click)
|> select(
[c],
[
fragment("date_trunc(?,?) as t", ^freq, c.inserted_at), count(c.link_id)
]
)
|> maybe_platform(platform)
|> group_by([c], fragment("t"))
|> Repo.all
end
它可以像您一样在匿名函数中完成,但我觉得这样更清楚。
这可能为时已晚,但我只是想分享我对这个问题的解决方案。
利用通过 Ecto macro api 的任何方法(例如 where
、select
、limit
、offset
等管道查询的事实仍然 returns 一个可查询的。
所以它可以通过一个简单的 if:
来完成
def query_clicks(freq \ "day", platform \ false) do
query = from(Click) |> select(...)
(if platform, do: where(query, [c], c.platform == ^platform), else: query)
|> group_by([c], fragment("t"))
|> Repo.all
end
它的代码更少。希望对您有所帮助:)
我有一个可选的参数platform
:
def query_clicks(freq \ "day", platform \ false) do
from(Click)
|> select(
[c],
[
fragment("date_trunc(?,?) as t", ^freq, c.inserted_at), count(c.link_id) ]
)
|> if platform, do: fn(q) -> where([c], c.platform == ^platform) end, else: fn(q): q end
|> group_by([c], fragment("t"))
|> Repo.all
end
我试图破解一些东西(参见 "if platform..."),但我不确定要使用的确切语法。我想做的是:
if platform != None:
return query + WHERE statement
else:
return query
正确的语法是什么?
您可以添加一个额外的功能maybe_platform/2
defp maybe_platform(queryable, nil), do: queryable
defp maybe_platform(queryable, platform) do
queryable
|> where([c], c.platform == ^platform)
end
那么你的query_clicks/2
看起来像
def query_clicks(freq \ "day", platform \ false) do
from(Click)
|> select(
[c],
[
fragment("date_trunc(?,?) as t", ^freq, c.inserted_at), count(c.link_id)
]
)
|> maybe_platform(platform)
|> group_by([c], fragment("t"))
|> Repo.all
end
它可以像您一样在匿名函数中完成,但我觉得这样更清楚。
这可能为时已晚,但我只是想分享我对这个问题的解决方案。
利用通过 Ecto macro api 的任何方法(例如 where
、select
、limit
、offset
等管道查询的事实仍然 returns 一个可查询的。
所以它可以通过一个简单的 if:
def query_clicks(freq \ "day", platform \ false) do
query = from(Click) |> select(...)
(if platform, do: where(query, [c], c.platform == ^platform), else: query)
|> group_by([c], fragment("t"))
|> Repo.all
end
它的代码更少。希望对您有所帮助:)