嵌套关联查询。查询范围
Nested association queries. Query scope
我正在尝试将记录范围限定为属于当前用户的内容。但我没有取得太大的成功。这是我正在尝试的:
def show(conn, %{"id" => id}) do
user_id = Map.get(Statcasters.Guardian.Plug.current_resource(conn), :id)
user = Repo.get!(User, user_id) |> Repo.preload(:leagues)
league = Repo.get(user.leagues, id)
end
但是我收到了这个错误:
** (Protocol.UndefinedError) protocol Ecto.Queryable not implemented for [%Statcasters.League{__meta__: #Ecto.Schema.Metadata<:loaded, "leagues">, id: 16, inserted_at: ~N[2018-05-05 22:13:23.675833], name: "Cam's League", player_limit: 10, updated_at: ~N[2018-05-05 22:13:23.675843], users: #Ecto.Association.NotLoaded<association :users is not loaded>, users_leagues: #Ecto.Association.NotLoaded<association :users_leagues is not loaded>}]
是什么创造了记录"queryable"?我想将列表传递到 Repo.get 是无效的。那么,我应该传递什么才能正确地将联赛范围限定到当前用户?
问题是 user.leagues
是一个 List
的预加载关联记录。如果您需要在该列表中查找记录,那么为此使用 Enum.find/3 怎么样:
Enum.find user.leagues, fn league -> league.id == id end
否则,league
只能由 id
从 Repo
加载,你不需要 leagues
由 user_id
限定范围,因为提供的 id
:
有一个唯一记录
Repo.get League, id
我正在尝试将记录范围限定为属于当前用户的内容。但我没有取得太大的成功。这是我正在尝试的:
def show(conn, %{"id" => id}) do
user_id = Map.get(Statcasters.Guardian.Plug.current_resource(conn), :id)
user = Repo.get!(User, user_id) |> Repo.preload(:leagues)
league = Repo.get(user.leagues, id)
end
但是我收到了这个错误:
** (Protocol.UndefinedError) protocol Ecto.Queryable not implemented for [%Statcasters.League{__meta__: #Ecto.Schema.Metadata<:loaded, "leagues">, id: 16, inserted_at: ~N[2018-05-05 22:13:23.675833], name: "Cam's League", player_limit: 10, updated_at: ~N[2018-05-05 22:13:23.675843], users: #Ecto.Association.NotLoaded<association :users is not loaded>, users_leagues: #Ecto.Association.NotLoaded<association :users_leagues is not loaded>}]
是什么创造了记录"queryable"?我想将列表传递到 Repo.get 是无效的。那么,我应该传递什么才能正确地将联赛范围限定到当前用户?
问题是 user.leagues
是一个 List
的预加载关联记录。如果您需要在该列表中查找记录,那么为此使用 Enum.find/3 怎么样:
Enum.find user.leagues, fn league -> league.id == id end
否则,league
只能由 id
从 Repo
加载,你不需要 leagues
由 user_id
限定范围,因为提供的 id
:
Repo.get League, id