Экто предзагрузка, если не ноль - PullRequest
0 голосов
/ 08 апреля 2019

Феникс n00b здесь.

Мне нужно предварительно загрузить ассоциации, если модель существует. Я написал:

model = Repo.get(Model, id)
|> Repo.preload([:asso1, :asso2, :asso3])

Но если модель не найдена, произойдет сбой, потому что Repo.preload не может получить ноль в качестве первого аргумента:

протокол Ecto.Queryable не реализован для nil, данный модуль не существует. Этот протокол реализован для: Ecto.Query, Atom, Ecto.SubQuery, Tuple, BitString

Каким будет путь феникса для достижения этой цели?

Я нахожу

model = if model = Repo.get(Model, id) do
  Repo.preload(model, [:asso1, :asso2, :asso3])
end

некрасиво.

Спасибо

Ответы [ 3 ]

0 голосов
/ 09 апреля 2019

Я только что попробовал это: заменив Model и assoc на соответствующие ассоциации, и это работает.

model = Repo.get(Model, id)
|> Repo.preload([:asso1, :asso2, :asso3])

То, что я предлагаю вам попробовать preload/3 в Query:

model = Repo.one(from m in Model, where: [id: ^id], preload: [:assoc1, :assoc2])
0 голосов
/ 15 апреля 2019

Бывает

model = Repo.get(Model, id)
|> Repo.preload([:asso1, :asso2, :asso3])

работает, даже если model равно nil.Должно быть, я сделал ошибку в отношении импорта модуля Model.

0 голосов
/ 08 апреля 2019

Я думаю, что я бы:

case Repo.get(Model, id) do
  nil -> {:error, :not_found}
  model -> {:ok, model |> Repo.preload([:asso1, :asso2, :asso3])}
end

и придерживался этой функции для использования другими частями приложения.Тем не менее, я думаю, что это больше вопрос согласованного стиля в вашем проекте / команде, чем что-либо еще.

...