【问题标题】:Rails 6.1 eager load ActiveStorage::VariantRecordRails 6.1 急切加载 ActiveStorage::VariantRecord
【发布时间】:2021-03-05 18:06:46
【问题描述】:

我一直渴望加载 ActiveStorage 附件,如下所示:

Journey.includes(created_by_user: [profile_picture_attachment: :blob])

自从我们升级到 Rails 6.1 并启用 tracking Active Storage variants in database 以来,我们一直在使用变体,我们注意到日志中有 n+1 个查询,因为循环如下:

Journey.includes(created_by_user: [profile_picture_attachment: :blob]).each do |j|
 j.created_by_user.profile_picture.variant(resize_to_fill: [32, 32]).processed
end
Journey Load (0.8ms)  SELECT "journeys".* FROM "journeys"
  User Load (0.7ms)  SELECT "users".* FROM "users" WHERE "users"."id" = $1  [["id", 607]]
  ActiveStorage::Attachment Load (0.6ms)  SELECT "active_storage_attachments".* FROM "active_storage_attachments" WHERE "active_storage_attachments"."record_type" = $1 AND "active_storage_attachments"."name" = $2 AND "active_storage_attachments"."record_id" = $3  [["record_type", "User"], ["name", "profile_picture"], ["record_id", 607]]
  ActiveStorage::Blob Load (0.6ms)  SELECT "active_storage_blobs".* FROM "active_storage_blobs" WHERE "active_storage_blobs"."id" = $1  [["id", 144]]
  ActiveStorage::VariantRecord Load (0.5ms)  SELECT "active_storage_variant_records".* FROM "active_storage_variant_records" WHERE "active_storage_variant_records"."blob_id" = $1 AND "active_storage_variant_records"."variation_digest" = $2 LIMIT $3  [["blob_id", 144], ["variation_digest", "k9S9jJS87DbFgXD1sW9j5XkOr1c="], ["LIMIT", 1]]
  ActiveStorage::VariantRecord Load (0.5ms)  SELECT "active_storage_variant_records".* FROM "active_storage_variant_records" WHERE "active_storage_variant_records"."blob_id" = $1 AND "active_storage_variant_records"."variation_digest" = $2 LIMIT $3  [["blob_id", 144], ["variation_digest", "k9S9jJS87DbFgXD1sW9j5XkOr1c="], ["LIMIT", 1]]
  ActiveStorage::VariantRecord Load (0.5ms)  SELECT "active_storage_variant_records".* FROM "active_storage_variant_records" WHERE "active_storage_variant_records"."blob_id" = $1 AND "active_storage_variant_records"."variation_digest" = $2 LIMIT $3  [["blob_id", 144], ["variation_digest", "k9S9jJS87DbFgXD1sW9j5XkOr1c="], ["LIMIT", 1]]
  ActiveStorage::VariantRecord Load (0.5ms)  SELECT "active_storage_variant_records".* FROM "active_storage_variant_records" WHERE "active_storage_variant_records"."blob_id" = $1 AND "active_storage_variant_records"."variation_digest" = $2 LIMIT $3  [["blob_id", 144], ["variation_digest", "k9S9jJS87DbFgXD1sW9j5XkOr1c="], ["LIMIT", 1]]
  ActiveStorage::VariantRecord Load (0.5ms)  SELECT "active_storage_variant_records".* FROM "active_storage_variant_records" WHERE "active_storage_variant_records"."blob_id" = $1 AND "active_storage_variant_records"."variation_digest" = $2 LIMIT $3  [["blob_id", 144], ["variation_digest", "k9S9jJS87DbFgXD1sW9j5XkOr1c="], ["LIMIT", 1]]

我尝试使用以下内容进行预加载,但似乎不起作用:

Journey.includes(created_by_user: [profile_picture_attachment: { blob: :variant_records }])

有没有人尝试过加载跟踪的变体记录来分享您的想法?

【问题讨论】:

    标签: ruby-on-rails eager-loading rails-activestorage


    【解决方案1】:

    原来有一个拉取请求正好解决了这个问题。对于任何寻求解决方案的人,请遵循合并请求。

    https://github.com/rails/rails/pull/37901

    它最终会绕到二级 PR,它允许预先加载存储的变体。它现在已合并到 Rails 的未来版本中,这是他们用来急切加载变体的代码:

    https://github.com/rails/rails/pull/40842/files

    【讨论】:

    • 例如with_all_variant_recordswith_attached_(image/video/file/...)
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-07-24
    • 2019-01-07
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多