1

比如我有三个模型用户,问答,它们之间的关系是:

class User < ActiveRecord::Base
  has_many :answers
  has_many :questions
end

class Question < ActiveRecord::Base
  has_many :answers, :dependent => :destroy
  belongs_to :user, :counter_cache => true
end

class Answer < ActiveRecord::Base
  belongs_to :user, :counter_cache => true
  belongs_to :question, :counter_cache => true
end

然后,当我想销毁一个问题(有 1000 个答案)时,会发生以下情况:答案将一一销毁,并将更新用户模型中的计数器,甚至是我要销毁的问题中的计数器,这将需要做了很久的计数器更新。

我的问题是如何让它更快?

4

1 回答 1

1

我得到了自己的解决方案,如下所示:

第 1 步:删除依赖的销毁,这将在销毁自身之前调用计数器更新。

第2步:添加我自己的before_destroy,像这样

before_destroy :delete_dependents

并使用 delete_all 函数删除而不调用任何 before_destroy,然后调用 reset_counters 函数重置用户模型中的计数器。

类问题的完整代码:

class Question < ActiveRecord::Base
  has_many :answers
  has_many :answer_users, :through => :answers, :source => :user, :uniq => true
  belongs_to :user, :counter_cache => true

  before_destroy :delete_dependents

  private
  def delete_dependents
    answer_user_ids = self.answer_user_ids # eager loading for store the answer users id
    Answer.delete_all(:question_id => self.id)
    answer_user_ids.each do |u_id|
      User.reset_counters u_id, :answers
    end
  end
end

PS:如果需要重置的计数器太多,您可能需要后台作业才能解决。

于 2013-07-24T06:02:04.390 回答