【问题标题】:How do you solve N+1 for ActiveStorage URLs?您如何解决 ActiveStorage URL 的 N+1 问题?
【发布时间】:2019-01-18 00:31:33
【问题描述】:

如何预加载所有记录及其 URL?

这就是我在 jbuilder 中获取 URL 的方法:

# views/users/index.json.jbuilder
...
json.avatar_url user.avatar.attached? && rails_blob_url(user.avatar)
...


Comment
    has_one :user

User
    has_one_attached :avatar

您将如何预加载所有用户及其头像?


Comments.includes(users: :avatar)

产生以下错误:

ActiveRecord::AssociationNotFoundError(在用户上找不到名为“头像”的关联;也许你拼错了?)

执行时弹出同样的错误:

User.includes(:avatar)

【问题讨论】:

  • 你这样做是为了一个用户列表?您还可以附上您填充此用户列表的位置吗?
  • @Nermin 添加。我想这就是你所要求的。
  • 什么是user.avatar,它与User 有什么关系?从您的错误来看,它似乎不是一个关联。是属性吗?
  • @JohanWentholt 我刚刚添加了更新。

标签: ruby-on-rails rails-activestorage ruby-on-rails-5.2


【解决方案1】:

对于名为 :avatar 的单个附件,Active Storage 添加了一个预加载相关关联的 with_attached_avatar 范围:

@users.with_attached_avatar.each do |user|
  # ...
end

请参阅has_one_attached 的 API 文档。

【讨论】:

  • 如果我拉取所有 cmets 并尝试预加载用户及其头像怎么办?
  • 啊,我找到了! includes(users: :avatar_attachment)。感谢您的帮助!
  • @Strawberry,关闭。您还需要使用 includes(users: { avatar_attachment: :blob }) 来预加载 blob。
  • @FaizaanKhan,为多个附件添加等效范围:例如,@users.with_attached_highlights
猜你喜欢
  • 2011-02-05
  • 2021-08-27
  • 2021-01-22
  • 2015-02-12
  • 1970-01-01
  • 2020-08-21
  • 2021-12-10
  • 2021-04-26
  • 1970-01-01
相关资源
最近更新 更多