获得协会与ecto的关联

时间:2017-11-08 19:27:13

标签: elixir phoenix-framework ecto

我有4个表,即:

Category -> sub1 -> sub2 -> product

表定义

分类

-name
-id
-description

SUB1

-id
-category_id
-name
-description

SUB2

-id
-sub1_id
-name
-description

产品

-id
-sub2_id
-name
-description
-color

我将我的架构定义为:

category.ex

schema "categories" do
    field :name, :string

    timestamps()
  end

sub1.ex

 schema "sub1" do
    field :name, :string
    belongs_to :category, App.Category
    timestamps()
  end

sub2.ex

 schema "sub2" do
        field :name, :string
        belongs_to :sub1, App.Sub1
        timestamps()
      end

product.ex

  schema "product" do
            field :name, :string
            belongs_to :sub2, App.Sub2
            timestamps()
          end

在我的控制器中我试过preload sub2和sub1 as

products = Product
                |> Repo.all
                |> Repo.preload(:sub2)
                |> Repo.preload(sub2: :sub1)

它有效。但是当我尝试将类别预加载为

 products = Product
                    |> Repo.all
                    |> Repo.preload(:sub2)
                    |> Repo.preload(sub2: :sub1)
                    |> Repo.preload(sub1: :category)

我收到错误,说产品与sub1没有关联。有没有办法使这个工作?最终我希望能够做到

product.sub2.sub1.category.name

在我的模板中,它会输出类别的名称

1 个答案:

答案 0 :(得分:0)

您是否尝试过Repo.preload(sub2: [sub1: [:category]])

错误来自

中的最后一次预加载
Repo.all(Product) 
|> Repo.preload(sub2: sub1) 
|> Repo.preload(sub1: :category)

实际上回到原始查询,所以它本质上是

Repo.all(Product) 
|> Repo.preload(sub1: :category)

根据您的架构无效。