web-dev-qa-db-ja.com

なぜ#Ecto.Association.NotLoadedを取得したのですか?

私にはチームがあり、各チームにはユーザーがいるので、多対多の関係としてユーザーをチームにリンクするための結合テーブルがあります。これが私のモデルです。

defmodule App.Team do
  use App.Web, :model

  schema "teams" do
    field :owner_id, :integer
    has_many :team_users, {"team_user", App.TeamUser}
  end

end
defmodule App.User do
  use App.Web, :model

  schema "users" do
    # field :email, :string
    has_many :team_user, App.TeamUser
  end
end

そして、ここに結合モデルがあります:

defmodule App.TeamUser do
  use App.Web, :model

  @primary_key false
  schema "team_user" do
    belongs_to :user, App.User
    belongs_to :team, App.Team
  end

end

次のように、クエリを実行して、ユーザーのすべてのチームと、結果のすべてのチームのユーザーを取得するとします。

teams_users =
      from(t in Team, where: t.owner_id == ^user_id)
      |> Repo.all()
      |> Repo.preload(:team_users)

私はこのログを取得します:

[%App.Team{__meta__: #Ecto.Schema.Metadata<:loaded>, id: 1,
  is_base_team: true, owner_id: 3,
  team_users: [%App.TeamUser{__meta__: #Ecto.Schema.Metadata<:loaded>,
    team: #Ecto.Association.NotLoaded<association :team is not loaded>,
    team_id: 1,
    user: #Ecto.Association.NotLoaded<association :user is not loaded>,
    user_id: 3},
   %App.TeamUser{__meta__: #Ecto.Schema.Metadata<:loaded>,
    team: #Ecto.Association.NotLoaded<association :team is not loaded>,
    team_id: 1,
    user: #Ecto.Association.NotLoaded<association :user is not loaded>,
    user_id: 4},
   %App.TeamUser{__meta__: #Ecto.Schema.Metadata<:loaded>,
    team: #Ecto.Association.NotLoaded<association :team is not loaded>,
    team_id: 1,
    user: #Ecto.Association.NotLoaded<association :user is not loaded>,
    user_id: 5}]}]

ログには、ID 1のチームと、IDを持つすべてのユーザーが含まれています:(3、4、5)しかし、なぜuser: #Ecto.Association.NotLoaded<association :user is not loaded>?そのIDでユーザーをロードするように要求しなかったので、なぜそのような警告が表示されたのですか?

使ってます {:phoenix_ecto, "~> 3.0-rc}

12
simo

:user:team_usersをプリロードする必要があります。

teams_users =
  from(t in Team, where: t.owner_id == ^user_id)
  |> Repo.all()
  |> Repo.preload(team_users: :user)

ドキュメントには、ネストされた関連付けに関するセクションがあります。 https://hexdocs.pm/ecto/Ecto.Query.html#preload/

9
Gazler