Ecto预加载(如果不为空)

时间:2019-04-08 14:10:47

标签: elixir phoenix-framework

凤凰号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

丑。

谢谢

3 个答案:

答案 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])
即使modelnil

也可以工作。我在导入Model模块时犯了一个错误。