How to autoload a relationship?
The setup:
lib/app/shop/resources/product.ex
I want to query for the product "Banana":
Question: How can I autoload the
lib/app/shop/resources/product.ex
defmodule App.Shop.Product do
[...]
relationships do
belongs_to :category, App.Shop.Category do
attribute_writable? true
end
end
[...]
enddefmodule App.Shop.Product do
[...]
relationships do
belongs_to :category, App.Shop.Category do
attribute_writable? true
end
end
[...]
endI want to query for the product "Banana":
iex(12)> fruits = App.Shop.Category.create!(%{name: "Fruits"})
#App.Shop.Category<
__meta__: #Ecto.Schema.Metadata<:loaded>,
id: "3a3ed806-6df4-4602-aff6-4eed50e814b2",
name: "Fruits",
...
>
iex(13)> banana = App.Shop.Product.create!(%{name: "Banana", price: 0.1, category_id: fruits.id})
#App.Shop.Product<
promotion: #Ash.NotLoaded<:relationship>,
category: #Ash.NotLoaded<:relationship>,
__meta__: #Ecto.Schema.Metadata<:loaded>,
id: "d655fa01-ece5-4ad9-b927-764a6a48b165",
name: "Banana",
price: Decimal.new("0.1"),
category_id: "3a3ed806-6df4-4602-aff6-4eed50e814b2",
...
>
iex(14)> App.Shop.Product.by_name("Banana")
{:ok,
#App.Shop.Product<
promotion: #Ash.NotLoaded<:relationship>,
category: #Ash.NotLoaded<:relationship>,
__meta__: #Ecto.Schema.Metadata<:loaded>,
id: "d655fa01-ece5-4ad9-b927-764a6a48b165",
name: "Banana",
price: Decimal.new("0.1"),
category_id: "3a3ed806-6df4-4602-aff6-4eed50e814b2",
...
>}
iex(15)> App.Shop.load(banana, :category)
{:ok,
#App.Shop.Product<
promotion: #Ash.NotLoaded<:relationship>,
category: #App.Shop.Category<
__meta__: #Ecto.Schema.Metadata<:loaded>,
id: "3a3ed806-6df4-4602-aff6-4eed50e814b2",
name: "Fruits",
...
>,
__meta__: #Ecto.Schema.Metadata<:loaded>,
id: "d655fa01-ece5-4ad9-b927-764a6a48b165",
name: "Banana",
price: Decimal.new("0.1"),
category_id: "3a3ed806-6df4-4602-aff6-4eed50e814b2",
...
>}iex(12)> fruits = App.Shop.Category.create!(%{name: "Fruits"})
#App.Shop.Category<
__meta__: #Ecto.Schema.Metadata<:loaded>,
id: "3a3ed806-6df4-4602-aff6-4eed50e814b2",
name: "Fruits",
...
>
iex(13)> banana = App.Shop.Product.create!(%{name: "Banana", price: 0.1, category_id: fruits.id})
#App.Shop.Product<
promotion: #Ash.NotLoaded<:relationship>,
category: #Ash.NotLoaded<:relationship>,
__meta__: #Ecto.Schema.Metadata<:loaded>,
id: "d655fa01-ece5-4ad9-b927-764a6a48b165",
name: "Banana",
price: Decimal.new("0.1"),
category_id: "3a3ed806-6df4-4602-aff6-4eed50e814b2",
...
>
iex(14)> App.Shop.Product.by_name("Banana")
{:ok,
#App.Shop.Product<
promotion: #Ash.NotLoaded<:relationship>,
category: #Ash.NotLoaded<:relationship>,
__meta__: #Ecto.Schema.Metadata<:loaded>,
id: "d655fa01-ece5-4ad9-b927-764a6a48b165",
name: "Banana",
price: Decimal.new("0.1"),
category_id: "3a3ed806-6df4-4602-aff6-4eed50e814b2",
...
>}
iex(15)> App.Shop.load(banana, :category)
{:ok,
#App.Shop.Product<
promotion: #Ash.NotLoaded<:relationship>,
category: #App.Shop.Category<
__meta__: #Ecto.Schema.Metadata<:loaded>,
id: "3a3ed806-6df4-4602-aff6-4eed50e814b2",
name: "Fruits",
...
>,
__meta__: #Ecto.Schema.Metadata<:loaded>,
id: "d655fa01-ece5-4ad9-b927-764a6a48b165",
name: "Banana",
price: Decimal.new("0.1"),
category_id: "3a3ed806-6df4-4602-aff6-4eed50e814b2",
...
>}Question: How can I autoload the
categorycategory when I query for a productproduct so that I don't have to do two SQL requests? App.Shop.Product.by_name("Banana")App.Shop.Product.by_name("Banana") should get me the productproduct and the categorycategory.