0

私のやり方

コントローラーパターン1 (注:ここでは、すべてのユーザーを呼び出しています!!)

@users = User.confirmed.joins(:profile)

表示パターン 1 (注: ここでは、最初の 10 ユーザーのみが表示されますが、すべてのユーザーの数が表示されます!!)

<%= "ALL ("+ @users.count.to_s + " users)" %>

<% @users.limit(10).each do |users| %>
    <%= render 'users/user', :user => users %>
<% end %>

ページの読み込み速度を考えると以下のようにすればいいのでしょうか?それとも変わらない?

コントローラーのパターン 2 (注:すべてのユーザーをカウントするためlimit(10)に、 とを追加しました)@users_count

@users = User.confirmed.joins(:profile).limit(10)
@users_count = User.confirmed.joins(:profile).count

ビューパターン2 (注:外してカウントlimit(10)に使用)@users_count

<%= "ALL ("+ @users_count.to_s + " users)" %>

<% @users.each do |users| %>
    <%= render 'users/user', :user => users %>
<% end %>
4

3 に答える 3

2

遅延読み込みを無効にしている場合は、Rails がデータベースからすべてのレコードを取得する必要がないため、2 番目の方法の方が高速です。クエリを実行するときは、必要なレコードのみを取得する必要があります。

遅延読み込みが有効になっている場合 (デフォルトで)、必要なときにデータがフェッチされるため、結果は同じになります。コントローラーに 2 つの変数を配置し、ビューで行ったのと同じクエリを記述することもできます。データは、必要な場合にのみフェッチされます。

@users = User.confirmed.joins(:profile)
@users_count = @users.count
@users = @users.limit(10)

Railsコンソールでアプリによって生成されたSQLを確認してから決定できます。

また、user.html.erb でプロファイルを使用している場合は、join の代わりに include を使用することを検討してください。関連付けられたレコードが必要な場合、結合によって n+1 問題が発生する可能性があります。そうしないと、不要なレコードをフェッチしたくないでしょう。詳細については、こちらの 12 の Eager Loading Associations を参照してください。

于 2013-06-12T10:21:05.427 に答える
1

2 つのオプションはまったく同じです。Userスコープをチェーンしているだけなので、どちらもすべての をロードしません。クエリは、ビューで .each を呼び出したときにのみ実行されます。その時点で.limit(10)とにかく .each を適用しました。コードがきれいなので、最初のオプションを使用します。

@users.countUserカウントを取得するために 1 つのクエリを実行しますが、オブジェクト をインスタンス化することはありません。@users.limit(10).each ...制限付きで1 つのクエリ (実際には を使用includesしたため 2 つ) を実行するため、10 個のオブジェクトとインクルードがインスタンス化されます。

于 2013-06-12T10:16:24.093 に答える
1

あなたが試すことができます@users.find_in_batches

ぜひご覧ください まとめて 探す

私にお知らせください

高速読み込みが必要な場合

Memcacheをお勧めしますmemcache

于 2013-06-12T09:54:24.797 に答える