У меня есть следующий запрос ActiveRecord. Он работал нормально, когда количество сообщений было 50 в моей тестовой среде, но когда мы ввели его в производство, а количество сообщений выросло до 5000, время ответа приблизилось к 30 секундам. Нехорошо.Плохо масштабируемые рельсы Запрос ActiveRecord
Как я могу сделать этот запрос более эффективно, так что держите его быстрым, так как количество сообщений растет. Запрос находит все предупреждения из всех сообщений, если они еще не завершены.
class AlertsController < ApplicationController
before_filter :get_user
respond_to :json, :html
def index
@messages = current_user.messages.where(:active => true).order("created_at ASC")
@alerts = Array.new
@messages.each do |message|
if (message.alerts.count > 0)
@alerts = @alerts + message.alerts.where(:completed => false)
end
end
respond_to do |format|
format.html
format.json
end
end
end
class Alert < ActiveRecord::Base
belongs_to :message
class Message < ActiveRecord::Base
has_many :alerts, dependent: :destroy
Какие индексации вы используете на ваших столах? – robbrit
good catch - в таблице предупреждений нет ссылки на сообщение. добавит его и обновит вашу производительность. – bluedevil2k
В качестве примечания использование '[]' для создания пустого массива более традиционно, чем использование 'Array.new'. Также вы можете использовать '+ =' для добавления вещей в массив вместо '@array = @array + ...'. – tadman