带有活动存储的 Rails 计数器缓存

问题描述 投票:0回答:2

我有一个带有 3 个附件的

Account
模型,使用 Active Storage,
has_many_attached :attachments
.

我想知道这个账号有多少附件,最有效的方法(又名no joins)

我找到的唯一解决方案是

Account.last.attachments.count
.size
,但它进行两个查询:一个用于帐户,一个使用 active_storage_attachments 表。

有没有办法计算缓存附件的数量?

提前谢谢你

编辑

当然可以自己设置数据库字段统计,想知道有没有默认的

编辑

我试着做

has_many_attached :attachments, counter_cache: true
,但它给出了一个错误

ruby-on-rails rails-activestorage counter-cache
2个回答
1
投票

我有一个有 7 个文件附件的模型有类似的问题,我需要使用计数器缓存而不是数据库查询来计算。诀窍是你必须在子模型中指定计数器缓存引用,在我的例子中它有

belongs_to :ParentModel
-
ActiveStorage::Attachment
ActiveStorage::Attachment
是 Rails 的“幕后”模型,所以我猴子修补了它。但是我决定通过回调来实现它,而不是通过添加
counter_cache: :true
来实现计数器缓存。我为
ParentModel
创建了一个具有以下结构的模块:

module ParentModel::ModuleName
  extend ActiveSupport::Concern

  class ActiveStorage::Attachment
    require 'active_record/counter_cache'

    before_create :after_create_action, if: :record_parent_model?
    before_destroy :after_destroy_action, if: :record_parent_model?

    def after_create_action
      ParentModel.increment_counter(:attachments_count, record_id, touch: true)
    end

    def after_destroy_action
      ParentModel.decrement_counter(:attachments_count, record_id, touch: true)
    end

    def record_parent_model?
      record_type == 'ParentModel'
    end
  end
end

我创建了一个迁移以将

:attachments_count
列添加到 ParentModel,就像直接计数器缓存实现一样。


0
投票
© www.soinside.com 2019 - 2024. All rights reserved.