繁体   English   中英

如何概括此Ecto / Elixir函数?

[英]How do I generalize this Ecto/Elixir function?

我有以下内容,如果platform存在,它将WHERE语句应用于ecto查询。

  defp maybe_platform(queryable, false), do: queryable
  defp maybe_platform(queryable, platform) do
      queryable
      |> where([c], c.platform == ^platform)
  end

如何对任何变量(而不只是platform )泛化此代码? (这是我正在努力的c.platform位)

您需要使用Ecto field https://hexdocs.pm/ecto/Ecto.Query.API.html#field/2

你的功能看起来像这样

defp maybe_field(queryable, field_name, field_value) do
    queryable
    |> where([c], field(c, ^field_name) == ^field_value)
end

接着

(from m in MyModel)
|> maybe_field(:platform, "platform_name_or_variable")
|> maybe_field(:another_field, "some value")
|> maybe_field(:is_platform_enabled, true)
|> Repo.all

您可以使用关键字作为过滤器。 看看Ecto.Query#where / 3

from(c in City, where: c.country == "Sweden")
from(c in City, where: [country: "Sweden"])

Ecto.Query.where/3接受关键字列表作为过滤器。 Elixir关键字列表只是每个两个元素的元组的Erlang列表的包装。 就是说,有点像那样做:

defp maybe_where(queryable, _param, false), do: queryable
defp maybe_where(queryable, param, value) do
  filters = [{param, value}]
  where(queryable, ^filters)
end

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM