0

「Mailboxer」( https://github.com/ging/mailboxer )という gem を使用しています
。これにより、Rails アプリ内でメッセージング システムが有効になります。

この gem では、各ページに 10 件の受信メッセージを表示しています。
ここではページネーションにカミナリを使用しています。

しかし、私のコードでは遅すぎます。一度に 25 以上の sql を発行しています :( どうすればこれを高速化できますか? 1 ページを表示するのに 1500 ミリ秒以上かかります。

これが私のコードです これの何が問題なのですか? これを高速化するテクニックはありますか?

コントローラ

@number_of_messages_to_display = 10
@messages = current_user.mailbox.inbox.page(params[:page]).per(@number_of_messages_to_display)
@messages_count = current_user.mailbox.inbox.count

ビュー (メッセージ/index.html.erb)

<%= @messages_count.to_s %> messages in your received message box.

<table>
    <% @messages.each do |m| %>
        <tr>
            <td><%= check_box_tag "id[]",m.id %></td>
            <td><%= if m.is_read?(current_user) then "Read" else "Un-read" %></td>
            <td><%= profile_link(m.recipients.first) if m.recipients.first != current_user %></td>
            <td><%= link_to m.subject, show_messages_path(:id => m) %></td>
            <td><%= today_datetime(m.last_message.created_at) %></td>
        </tr>
    <% end %>
</table>

ビュー (ヘルパー/application_helper.rb)

def profile_link(user)
    if user
        nickname = user.user_profile.try(:nickname) 
        username = user.try(:username)
        link_to nickname,  show_user_path(username)
    else
        "Un-known"
    end
end

def today_datetime(date_time)
  date_time.to_date == Date.current.to_date ? "<span class='text-info'>#{date_time.to_s(:us)}</span>".html_safe : date_time.to_s(:us)
end

ルート.rb

get 'messages/:id' => 'messages#show', :as => :show_messages
get "users/:id" => 'users#show', :as => :show_user

models/user.rb

def to_param
  "#{username}"
end
4

1 に答える 1

0

N + 1 問題の典型的な例。

を取得する@messages = current_user.mailbox.inbox.pageと、テーブルからレコードが取得されmessagesます。

ビューでは、それらをループして、各メッセージのrecipientsリストを確認します (ここで見られるように、おそらくテーブルに基づく関係)has_many。そのため、メッセージごとに別のクエリをデータベースに送信することになります。receipts

メッセージと一緒に受信者を取得することでこれを修正できます(last_message使用しているため、関連付けも同様です)。

@messages = current_user.mailbox.inbox.
    includes(:receipt, :last_message).page

また、最新のコンピューターでは 25 個のクエリが非常に高速に実行されるため、これをさらに複雑にする別の問題が発生する可能性があります。RailsPanel ツールなどを使用して、どこで時間が費やされているかを追跡することをお勧めします。

于 2013-07-17T07:55:54.037 に答える