I have a flow where if the “id” is an 8 digit number, assume it’s a date of a concert we want to look up. Otherwise, use the “id” as normal:
show_query = if String.length(id) == 8 do
# performed_on is created from the "id" param
from c in Concert,
.....
where: c.performed_on == ^performed_on
else
from c in Concert,
....
where: c.concert_id == ^id
end
show = Repo.one(show_query)
# Now, look up the tracks played on that concert
tracks_query = from ct in ConcertTrack,
where: ct.concert_id == show.concert_id
....
Is this a good pattern to do? The query is repeated, except for the where clause.
Usually if you’re going to overload a parameter like this with two meanings, it’s better if they are distinguishable - for instance, using 2023-12-26 instead of 20231226 for a date.
It’s hard to judge the usefulness of this code in isolation, but some thoughts:
the specifics of ...... are important for making Repo.one do something useful, otherwise this is a complicated way to pass id to tracks_query for inputs not of length 8.
is show used subsequently in this function? If not, you might consider adding some additional code to tracks_query to handle that lookup
conversely, could show be an argument to whatever function this is? Then a separate function could translate id → show
I can’t speak to your specific domain, but having known some very busy session musicians you may want to consider if “exactly one concert per calendar date” is a safe constraint on your data