У меня есть много повторяющихся записей, которые я пытаюсь отсеять, и для этого я сейчас запускаю:
Survey.active.each do |survey|
survey.response_sets.completed.each do |set|
answer_ids = []
set.responses.each do |r|
if r.answer.blank?
r.destroy
else
if answer_ids.include? r.answer_id
r.destroy
else
answer_ids << r.answer_id
end
end
end
end
end
Он находит все активные опросы, получает наборы ответов для каждого опроса, затем отдельные ответы для каждого набора ответов.
Затем проверяется, является ли ответ дубликатом, основываясь на том, существует ли answer_id
для другого ответа в наборе ответов. В данном наборе ответов может быть только один ответ для данного answer_id
. Так что, если есть дубликаты, он уничтожает дубликат.
Более пары сотен тысяч строк, что будет очень медленным.
Итак, как я могу ускорить этот процесс?
Вот SQL-вызовы для каждого из них:
Survey.active
SELECT "surveys".* FROM "surveys" WHERE "surveys"."active" = 't'
survey.response_sets.completed
SELECT "response_sets".* FROM "response_sets" WHERE ("response_sets".survey_id = 12345) AND (completed_at IS NOT NULL)
set.responses
SELECT "responses".* FROM "responses" WHERE ("responses".response_set_id = 54321)
Я использую Rails 3.0.6 и PostgreSQL.