Тайник рельсов

Например, у меня есть три модели пользователя, вопрос и ответ, и отношения между ними:

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 ответами), это произойдет: ответы уничтожат один за другим и обновят счетчик в пользовательской модели, даже счетчик в вопросе, который я хочу уничтожить, и который займет долгое время делать обновление счетчика.

мой вопрос как сделать это быстрее?

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: если нужно сбросить слишком много счетчиков, вам может понадобиться фоновая работа для ее решения.

Другие вопросы по тегам