elixir - 嵌套关联查询。查询范围
问题描述
我正在尝试将记录范围限定为属于当前用户的内容。但我没有太大的成功。这是我正在尝试的:
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>}]
是什么让记录“可查询”?我猜将列表传递到 Repo.get 是无效的。那么,我应该传递什么才能正确地将联赛范围限定为当前用户?
解决方案
问题是user.leagues
预List
加载的关联记录。如果您需要在该列表中查找记录,那么使用Enum.find/3怎么样:
Enum.find user.leagues, fn league -> league.id == id end
否则, aleague
可以由id
out of加载Repo
,您不需要范围leagues
by user_id
,因为提供了一个唯一记录id
:
Repo.get League, id
推荐阅读
- vue.js - Vue路由器导航在一页应用程序v-navigation-drawer上可滚动时有间隙
- javascript - React、HTML 和 JavaScript:错误:超出最大更新深度
- python - 计算 Pandas DataFrame 中每个组的状态变化
- c# - 如何在使用 EF Core 进行 API 响应后向数据库添加翻译?
- python - 如何在我的网站上管理奇怪的字体?
- c# - 无法执行 Cookie 身份验证:SignInAsync 和 AuthenticateAsync 不成功
- php - 如何根据索引php合并两个数组?
- javascript - 为什么将异步等待放在数组映射回调中?
- postgresql - 使用 postgresql 和 typeorm 命令获取 100km 内的实体
- loops - 如何根据数据框日期范围自动调整带有 seaborn 的 xlim