【发布时间】:2019-04-15 15:58:53
【问题描述】:
凤凰n00b在这里。
如果模型存在,我需要预加载关联。我写道:
model = Repo.get(Model, id)
|> Repo.preload([:asso1, :asso2, :asso3])
但是如果没有找到模型,它就会失败,因为Repo.preload 不能忍受接收 nil 作为第一个参数:
protocol 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
丑。
谢谢
【问题讨论】:
-
您的初始解决方案应该可以正常工作。如果您查看
Ecto.Repo.Preload/3docs,您会发现它采用nil作为参数。你确定你传递了一个现有的Model吗?您的错误似乎表明您像这样调用Repo.get...Repo.get(nil, id)。 (> 给定的模块不存在) -
你说得对,我不知道我是怎么弄糊涂的,但
MyApp.Repo.get(Vae.User, -1) |> MyApp.Repo.preload(:association)有效 :) -
很高兴你能成功