gpt4 book ai didi

elixir - 预加载关联和分页

转载 作者:行者123 更新时间:2023-12-04 20:36:43 25 4
gpt4 key购买 nike

我有一个 show我的行动 PersonController这是这样的:

person = Repo.get_by(Person, nick: params["nick"])
page = Message
|> where([m], m.person_id == ^person.id)
|> where([m], m.hidden == false)
|> order_by([m], desc: m.created_at)
|> Repo.preload(:channel)
|> Repo.paginate(page: params["page"], page_size: 250)
paginate方法来自 Scrivener 包。

Repo.preload在那里行,我收到此错误:
key :__meta__ not found in: #Ecto.Query<from m in Logs.Message, where: m.person_id == ^34424, where: m.hidden == false, order_by: [desc: m.created_at]>

如果我删除 Repo.preload ,此代码工作正常。我需要预加载 channel ,因为在消息模板中我生成了一个指向特定 channel 的链接:
<a href='/<%= @message.channel.name %>?date=<%= date %>#<%= @message.id %>'>
[<%= @message.created_at |> Calendar.Strftime.strftime!("%H:%M:%S") %>]
</a>

一个人可以在一天内向其发送消息的 channel 可能会有所不同,因此我想预先加载这些 channel 。我怎样才能做到这一点?

最佳答案

Repo.preload期望收到一个模型或模型列表。看起来您正在向它传递一个查询。有两种解决方案:

  • 搬家 Repo.preloadRepo.paginate调用 - 此时我们正在处理模型(我认为 Repo.paginate 执行查询,我不直接熟悉它)
  • 更改来自 Repo.preload 的调用至 Ecto.Query.preload - 后者转换查询并将有关预加载的信息直接插入生成的查询
  • 关于elixir - 预加载关联和分页,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/33815418/

    25 4 0
    Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
    广告合作:1813099741@qq.com 6ren.com