0

一連のクエリを作成したいのですが、最初のクエリは特定の日付以降に作成されたすべてのレコードを検索し、2 番目のクエリはその日付より前に作成されたすべてのレコードを表示します。30,000 件のレコードがあるため、設定した日付に最も近い 10 件のみを表示したいと思います。

 private
def current_scorecards_for_review
  self.where("created_at > ? AND reviewed = ?", Date.new(2013,04,01), false)
end

def historic_scorecards_for_review
  self.where("created_at < ? AND reviewed = ?", Date.new(2013,04,01), false).limit(10)
end

コンソールで試してみたときに、これまでに書いたことです

e = Scorecard.where("created_at < ?", Date.new(2013,04,01)).limit(10)

そして呼び出された

e.count

=> 30175 が返されます。10 だけが返されるようにするにはどうすればよいですか? 30,000行あると、これは遅くなります。

4

1 に答える 1

3

ActiveRecord::Relationオブジェクトを呼び出すcountと、カウント クエリがトリガーされます。SQL 制限はカウント クエリで期待どおりに機能しません。これは、制限が実際には結果のカウント自体に適用されるためです。これは通常、単一の行です (GROUP BY を使用しない場合)。

SELECT COUNT(*) 
FROM scorecards 
WHERE created_at < '2013-04-01' AND reviewed = false 
LIMIT 10

呼び出すときto_a(またはall実際にクエリをトリガーする他のもの)、返されたコレクションで作業しています - コレクションcountの長さを返すようになりました。

hereこれに関する議論については、を参照してください。

于 2013-04-17T14:02:21.190 に答える