凤凰号n00b在这里。
如果模型存在,我需要预加载关联。我写道:
model = Repo.get(Model, id)
|> Repo.preload([:asso1, :asso2, :asso3])
但是,如果找不到模型,则会失败,因为Repo.preload
无法忍受将nil作为第一个参数:
协议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
丑。
谢谢
答案 0 :(得分:0)
我想我会
case Repo.get(Model, id) do
nil -> {:error, :not_found}
model -> {:ok, model |> Repo.preload([:asso1, :asso2, :asso3])}
end
,并将其保留在应用程序其他部分要使用的某些功能后面。话虽如此,我认为您的项目/团队中的风格一致性比什么都重要。
答案 1 :(得分:0)
我刚刚尝试过:用相应的关联替换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])
答案 2 :(得分:0)
发生了
model = Repo.get(Model, id)
|> Repo.preload([:asso1, :asso2, :asso3])
即使model
是nil
,也可以工作。我在导入Model
模块时犯了一个错误。