【问题标题】:How trigger counter cache after destroy_alldestroy_all 后如何触发计数器缓存
【发布时间】:2020-01-01 20:31:28
【问题描述】:

我必须销毁大量数据,并更新我的计数器缓存,但是当我使用 destroy_all 时,每次删除都会调用计数器缓存。有没有办法只在destroy_all之后更新我的计数器?

我已经尝试过 ActiveModel 回调,但它们与 destroy_all 相同,每条记录调用一次。

  belongs_to :research, counter_cache: :total_participants
  ResearchParticipant.from_research(@research_id).destroy_all

【问题讨论】:

  • destroy_all 调用所有回调(包括更新计数器缓存列),delete_all 不会触发任何回调,但您必须在最后手动更新计数器缓存列的值

标签: ruby-on-rails ruby activemodel counter-cache


【解决方案1】:

您可以使用不实例化对象的delete_all。意味着不调用回调。然后用reset_counters重置缓存。

ResearchParticipant.from_research(@research_id).delete_all
Research.reset_counters(@research_id, :research_participants)
# assuming Research has_many :research_participants, counter_cache: :total_participants

如果您依赖必须触发的回调,这可能不是一个选项。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2020-02-11
    • 2019-10-09
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-06-14
    • 2017-10-26
    相关资源
    最近更新 更多