默认情况下预加载Ecto关联

Dan*_*_es 15 elixir ecto

有没有办法预先加载ecto关联而不显式使用preload:?

类似于架构中的选项?

schema "gadgets" do
  field :foo,
  has_many :bars, Myapp.Bar, preload: true
end
Run Code Online (Sandbox Code Playgroud)

我正在做类似的事情

Repo.get(Gadget, id)
  |> Repo.preload: [:bars]
Run Code Online (Sandbox Code Playgroud)

编辑:我试图这样做的原因是因为我想将相关模型预加载到已经预加载的相关模型,如

 preload: [:invoices preload: :items] 
Run Code Online (Sandbox Code Playgroud)

Jos*_*lim 29

您还可以作为查询的一部分进行预加载:

defmodule Gadget do
  use Ecto.Model

  # ...

  def with_invoices(query) do
    from q in query, preload: [invoices: :items]
  end
end
Run Code Online (Sandbox Code Playgroud)

然后:

Gadget
|> Gadget.with_invoices
|> Repo.get!(id)
Run Code Online (Sandbox Code Playgroud)

  • 有什么理由它不是架构中的选项吗?我知道在查询时保留选项是否预加载是很好的,但对于某些相关模型,您总是需要预先加载它.在我的情况下,发票总额是根据项目计算的,如果没有预加载则无法使用. (8认同)