次のActiveRecordクエリがあります。テスト環境でメッセージ数が50の場合は正常に動作しましたが、本番環境に移行してメッセージ数が5000に増えると、応答時間は30秒に近づきました。良くない。
どうすればこのクエリをより効率的に実行できるので、メッセージの数が増えても迅速に処理できます。クエリは、メッセージがまだ完了していない場合、すべてのメッセージからすべてのアラートを検索します。
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