5

名前が何らかのトークンであるすべてのレコードを検索する Rails ActiveRecord クエリがあります。

records = Market.where("lower(name) = ?", name.downcase );
rec = records.first;
count = records.count;

サーバーは、 と の呼び出しの.first両方.countがデータベースにヒットしたことを示しています。

←[1m←[35mCACHE (0.0ms)←[0m  SELECT "markets".* FROM "markets" WHERE (lower(nam
e) = 'my market') LIMIT 1

←[1m←[36mCACHE (0.0ms)←[0m  ←[1mSELECT COUNT(*) FROM "markets" WHERE (lower(na
me) = 'my market')←[0m

すでにクエリされた結果を使用できるのに、データベースにアクセスしてカウントを取得するのはなぜですか?

今後の活躍が気になります。現在、1000 件のレコードがあります。そのテーブルが 800 万行を保持し、1 つはデータ用、もう 1 つはカウント用の 2 つのクエリを実行すると、コストが高くなります。

データベースではなくコレクションからカウントを取得するにはどうすればよいですか?

4

3 に答える 3

10

RactiveRecord は遅延クエリを使用してデータベースからデータをフェッチします。レコードを単純にカウントしたい場合は、再実行配列のサイズのみを呼び出すことができます。

records = Market.where("lower(name) = ?", name.downcase ).all
records.size
于 2012-06-01T03:05:50.410 に答える
8

です。records_ ActiveRelation条件に一致するすべての Market レコードの配列だと思うかもしれませんが、そうwhereではありません。firstまたはそのリレーションのようなものを参照するたびにcount、クエリを実行して、求めているものを取得します。

実際のレコードを配列.allに取得するには、リレーションに追加して実際に取得します。お気に入り:

records = Market.where("lower(name) = ?", name.downcase).all
count = records.count
于 2012-06-01T03:08:38.343 に答える