21

preload: を明示的に使用せずに ecto アソシエーションをプリロードする方法はありますか?

スキーマのオプションのようなものですか?

schema "gadgets" do
  field :foo,
  has_many :bars, Myapp.Bar, preload: true
end

私は次のようなことをしています

Repo.get(Gadget, id)
  |> Repo.preload: [:bars]

編集:私がこれをやろうとしている理由は、すでにプリロードされている関連モデルに関連モデルをプリロードしたいからです。

 preload: [:invoices preload: :items] 
4

2 に答える 2

-2

それが最速の方法かどうかはわかりませんが、次のように after_load コールバックを使用してこれを行うことになりました。

defmodule Invoice do
  use Ecto.Model

  after_load :preload_items

  def preload_items(invoice) do
    invoice |> Repo.preload([:items])
  end
end

これで、Invoice がロードされるたびに、たとえそれが他のものによってプリロードされていたとしても、関連するアイテムがプリロードされます。

編集 - しないでください

代わりに、プリロードをクエリに入れます。上記のコードで 1000 件の請求書を取得すると、1 + 1000 のクエリが発生します。クエリのプリロードは 0NE を追加します。クエリ。1 + 1 < 1000 + 1。

  query = from c in Gadget,
  #retrieve nested associations adds one query
  preload: [invoices: :items]
  select c

Repo.all(query)
于 2015-04-14T04:17:14.207 に答える