例如,我有三个模型用户,问题和答案,它们之间的关系是:
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个答案)时,会发生以下情况: 答案将逐一销毁,并将更新用户模型中的计数器,甚至是我想破坏的问题中的计数器,并且需要很长时间才能进行计数器更新。
我的问题是如何让它更快?
答案 0 :(得分:1)
我有这样的解决方案:
第1步: 删除依赖的destroy,它会在销毁之前调用counter更新。
第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:如果需要重置太多计数器,您可能需要一个后台作业才能解决。