2017-02-26 1 views
0

私はpublic_activityの宝石を使用していますし、追跡可能な所有者が現在のユーザーと同じである場合、出力では、私がチェックしてる場合は繰り返しのパフォーマンスを増やす:Railsの - ステートメント

= a.owner == current_user ? 'You' : a.owner.name 
did this activity 

私は束を得ますログ内のキャッシュ呼び出しの数:

User Load (1.8ms) SELECT "users".* FROM "users" WHERE "users"."id" = $1 LIMIT $2 [["id", 1], ["LIMIT", 1]] 
    Rendered public_activity/post/_create.html.haml (1.4ms) 
    Rendered public_activity/_snippet.html.haml (11.4ms) 
    CACHE (0.0ms) SELECT "users".* FROM "users" WHERE "users"."id" = $1 LIMIT $2 [["id", 1], ["LIMIT", 1]] 
    Rendered public_activity/post/_create.html.haml (13.9ms) 
    Rendered public_activity/_snippet.html.haml (18.9ms) 
    CACHE (0.0ms) SELECT "users".* FROM "users" WHERE "users"."id" = $1 LIMIT $2 [["id", 1], ["LIMIT", 1]] 
    Rendered public_activity/comment/_comment.html.haml (0.9ms) 
    Rendered public_activity/_snippet.html.haml (12.1ms) 
    CACHE (0.0ms) SELECT "users".* FROM "users" WHERE "users"."id" = $1 LIMIT $2 [["id", 1], ["LIMIT", 1]] 
    Rendered public_activity/comment/_comment.html.haml (2.7ms) 
    Rendered public_activity/_snippet.html.haml (56.3ms) 
    CACHE (0.0ms) SELECT "users".* FROM "users" WHERE "users"."id" = $1 LIMIT $2 [["id", 1], ["LIMIT", 1]] 
    Rendered public_activity/comment/_comment.html.haml (0.6ms) 
    Rendered public_activity/_snippet.html.haml (4.5ms) 
    CACHE (0.0ms) SELECT "users".* FROM "users" WHERE "users"."id" = $1 LIMIT $2 [["id", 1], ["LIMIT", 1]] 
    Rendered public_activity/content/_comment.html.haml (2.1ms) 
    Rendered public_activity/_snippet.html.haml (9.5ms) 

条件付きでロードする方法はありますか?

答えて

1

あなただけのIDが複数のアクティビティの所有者は、現在のユーザー(所有者名を取得する)でない場合

= a.owner_id == current_user.id ? 'You' : a.owner.name 

キャッシュコールはおそらくまだどうなるの属性を比較する、ユーザーレコードをロードする必要はありません。

2

@ jverbanは、不必要なレコードの読み込みを避けるために、レコードIDを比較できるということは間違いありません。しかし、積極的なロードに関する質問に答えるには、ActiveRecordクエリチェーンでincludesメソッドを使用して熱心に負荷をかけることができます。例:あなたはowner関係を参照しようとするので、彼らは同様にロードされなければならないのRailsを教えてくれます

Activity.includes(:owner).latest 

N + 1個のクエリを検出してこのようなN + 1個のクエリ状況が発生したときに警告するために、bullet宝石をプロジェクトに追加することを強くおすすめします(開発環境およびテスト環境のみ)。

+0

私は既にそれを行い、すでにその宝石を持っています。ありがとう。 – Ish

関連する問題