如何推广这个外生/药剂的功能?

问题描述 投票:1回答:3

我有以下,如果存在platform施加一个WHERE语句的外生查询。

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

我怎么可以概括为任何变量(而不是仅仅platform)这个代码? (它是c.platform位,我挣扎)

elixir phoenix-framework ecto
3个回答
2
投票

您需要使用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

0
投票

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

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

0
投票

Ecto.Query.where/3接受关键字列表的过滤器。药剂关键字列表仅仅是围绕每两个元素的元组的列表二郎的包装。这就是说,有点像会做:

defp maybe_where(queryable, _param, false), do: queryable
defp maybe_where(queryable, param, value) do
  filters = [{param, value}]
  where(queryable, ^filters)
end
© www.soinside.com 2019 - 2024. All rights reserved.