jihantoro
Conditional in Ecto.query
my original syntax :
result =
Enum.map(
from(Repo, where: ^whitelisted_params)
|> where([schema], like(schema.nama, ^"#{nama}%"))
|> limit(^query_limit)
|> Repo.all(),
fn elem ->
elem |> Map.from_struct() |> Map.delete(:__meta__)
end
)
i want to add where([schema], like(schema.tgl, ^tgl)) if a conditional are true
tried :
result =
Enum.map(
from(Repo, where: ^whitelisted_params)
|> where([schema], like(schema.nama, ^"#{nama}%"))
|> (fn(n) -> tgl != "" |> where([schema], like(schema.tgl, ^tgl)) || "" end).()
|> limit(^query_limit)
|> Repo.all(),
fn elem ->
elem |> Map.from_struct() |> Map.delete(:__meta__)
end
)
error :
protocol Ecto.Queryable not implemented for true, the given module does not exist. This protocol is implemented for: Atom, BitString, Ecto.Query, Ecto.SubQuery, Tuple
thank you !
Most Liked
peerreynders
|> (fn(n) -> tgl != "" |> where([schema], like(schema.tgl, ^tgl)) || "" end).()``
looks to me that you were trying to do something like this
|> (fn(query) ->
case tgl do
"" -> query
_ -> where(query, [schema], like(schema.tgl, ^tgl))
end
end).()
tme_317
Whenever I have a conditional in a pipeline (which happens all the time) I just write a separate private function, so in your pipeline it would look like this:
|> maybe_filter_by_tgl(schema, tgl)
Then a separate function:
defp maybe_filter_by_tgl(query, schema, tgl) do
if tgl != "", do: where(query, [schema], like(schema.tgl, ^tgl)), else: query
end
This is exactly the same as the anonymous function technique from @peerreynders response… for some reason I just find it easier to read (personal preference).
OvermindDL1
Yep, this is a pattern I use super often. I keep meaning to find a way to pipeline it better, but I just tend to have long repeated sets of this small ‘mutation’ chunks (copy/pasted from my sources):
query =
case refine do
[pidm: pidm] when is_integer(pidm) -> where(query, [s], s.spriden_pidm == ^pidm)
[pidm: pidms] when is_list(pidms) -> where(query, [s], s.spriden_pidm in ^pidms)
[cnum: cnum] when is_binary(cnum) -> where(query, [s], s.spriden_id == ^cnum)
[cnum: cnums] when is_list(cnums) -> where(query, [s], s.spriden_id in ^cnums)
[id: id] when is_binary(id) -> where(query, [s], s.spriden_id == ^id)
[id: ids] when is_list(ids) -> where(query, [s], s.spriden_id in ^ids)
[] -> query
end
Obviously I don’t use the formatter because it absolutely destroys the readability of these… I wish it could be fixed… ![]()








