1

開発ログでいつコールが表示され始めたのか、現時点では追跡できませんSELECT COUNT(*)が、それは発生しており、その理由はないようです。これが正常なのか、なぜそうなのかを知りたいです。私はそれが大きな問題だとは思いませんが、必要がないのに、データベースへの余分な呼び出しが必要になるのはなぜですか。

私のコントローラーには

def some_action
  @activities = user.activities
end

Userクラスでは、私はそれを持っていますhas_many :activities

このアクションを呼び出すと、ログ出力は

User Load (0.4ms)  SELECT "users".* FROM "users" WHERE "users"."id" = 1 LIMIT 1
(0.3ms)  SELECT COUNT(*) FROM "activities" WHERE "activities"."user_id" = 1
Activity Load (0.3ms)  SELECT "activities".* FROM "activities" WHERE "activities"."user_id" = 1

確かに言えることは、そのSELECT COUNT(*)呼び出しを行うために使用されていないということだけです。私が知る限り、そのカウントを取得しようとするものは何もありません。

Rails 3.2.6 と PostgreSQL 9 を使用しています。

4

1 に答える 1

1

count クエリの理由は、Rails の遅延読み込みと、データを使用する順序によるものであることがわかりました。

すべての を繰り返し処理している間@activities、ビュー テンプレートのインスタンス変数で最初に行うことは、通過するものがあるかどうかを確認することです。そうでない場合は、ユーザーに別のものを表示します。

@activities.empty?これは、すべてのレコードを配列にロードしてからチェックするよりも効率的です。必要に応じて、アクションを次のように変更できます

@activities = user.activities.all

これにより、COUNT 呼び出しが防止され、ビューを構築する前にすべてのレコードが読み込まれます。

于 2012-07-26T21:14:48.043 に答える