如何解决ActiveStorage URL的N + 1?

时间:2018-08-10 11:38:27

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

您如何预加载所有记录及其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(在用户上找不到名为“ avatar”的关联;也许您拼错了?)

执行时弹出相同的错误:

User.includes(:avatar)

1 个答案:

答案 0 :(得分:8)

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

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

请参阅has_one_attached的API文档。