2

今、私が言うならば、私は多くのヒットを持っているキャンペーンと呼ばれるテーブルを持っています:

Campaign.find(30).hits

これには4秒、つまり4213ミリ秒かかります。

代わりにこれを呼び出す場合:

キャンペーン=Campaign.find(30)
キャンペーン.hits.count

それでもすべてのヒットをロードしてからカウントしますか?それとも、私がカウントしていることを確認し、すべてのヒットをロードしないようにしますか?(現在300,000行以上です)。

ヒットをロード/カウントするスマートな方法を見つけようとしています。Campaign.rbモデルに次のようなメソッドを追加することを考えています。

def self.total_hits
   find:first、:select =>'COUNT(id)as hits'、:conditions => ["campaign_id =?"、self.id]
終わり

クエリがテーブルから読み込まれないことは知っていますがhits、これは、Ruby on Railsがこれを実行するのとは対照的に、自作のクエリからクエリをカウントする例にすぎません。

このmemcacheクエリはより効率的でしょうか?(私はそれを実行していますが、同じ速度で、より良い/より速い/より遅いようには見えません。)

def self.hits
    Rails.cache.fetch( "Campaign_Hits _#{self.campaign_id}"、:expires_in => 40){
      find(:first、:select =>'COUNT(id)as hits'、:conditions => ["campaign_id =?"、self.campaign_id])。hits
    }
終わり

どんな提案も素晴らしいでしょう!

4

2 に答える 2

6

どうですか:

Campaign.find(30).hits.count

また、以下を追加することを検討することもできますhit.rb(キャンペーンとヒットの間に1対多の関係があると仮定します)。

belongs_to :campaign, :counter_cache => true

campaigns次に、テーブルに。という列が必要ですhits_counthitsこれにより、カウントのみを取得している場合は、ヒットを完全に回避できます。

APIで完全なランダウンを確認できます。

于 2009-02-04T02:47:46.917 に答える
1

私のActiveRecordは少し錆びているかもしれないので、もしそうなら許してください、しかしIIRCCampaign.find(30).hitsは少なくとも2つの別々のクエリです。どうしCampaign.find(30, :include => [ :hits ]).hitsますか?これにより、単一のクエリが実行されます。

于 2009-02-04T02:36:42.197 に答える