путаю аргументы, и потом мучаюсь с дебагом.
решил это мапом побороть:
def get_session(%{user_id: user_id, id: id}) when is_nil(id) or is_nil(user_id), do: nil
def get_session(p = %{user_id: user_id, id: id}), do: get_session_query(p) |> Repo.one()
defp get_session_query(%{user_id: user_id, id: id}), do: from s in Session, where: s.user_id == ^user_id and s.id == ^id
Длинно, зачем , do: когда можно нормальный do end
def get_session(%{id: nil}), do: nil def get_session(%{user_id: nil}), do: nil def get_session(p), do: get_session_query(p) |> Repo.one() и не уверен что-то я ,что сработает ^ т.к. оно в паттерн-матчинге только работает
from это макрос из Ecto.Query, там ^ имеет другое значение
а when не предпочтительнее? так все пишут? 🙂
ну красивее же, "так все пишут" - не замечал) when юзаю когда паттерн-матч не прикрутить
красивее — да. у меня просто DRY OCD.
можно еще короче? def get_session(%{user_id: user_id, id: id}) when is_nil(id) or is_nil(user_id), do: nil def get_session(%{user_id: user_id, id: id}) do query = from(s in Session, where: s.user_id == ^user_id and s.id == ^id) Repo.one(query) end
Лайфхак: вместо двух is_nil можно писать nil in [id, user_id]
https://en.wikipedia.org/wiki/Obsessive%E2%80%93compulsive_disorder
а где тут отсутствие dry не понимаю) фукнции-то разные, у них паттерн-матч разный :)
Тут можно просто Repo.get_by
def get_session(%{id: id, user_id: user id}) do if id && user_id do from(...) |> Repo.one() end end
два раза писать get_session для ограничения c nil когда можно раз
не путайте с функциями в других ЯП) это разные функции, хоть и название одинаковое
не, эт хуйня, сначала матчинг по одному ключу, потом по другому, никакого ry
Обсуждают сегодня