我如何概括这个 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.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
您需要使用 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
我有以下内容,如果 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.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
您需要使用 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