2012-03-29 19 views
1

私はRailsアプリケーションでユーザーがページにアクセスするたびに、データベースからThingyを送信する必要があります。データベースがThingiesを使い果たした場合、より多くのものを生成するには高価な処理を行わなければなりません。の後に、コントローラのフィルタを動的に追加してを生成し、ページの読み込み時間に影響を与えないように応答します。ここに私のコントローラは次のようになります。コントローラーアクション内で、フィルターをRailsに動的に追加するにはどうすればよいですか?

私はこれを実現するためにget_a_thingy機能を追加することができますどのような
class ThingyController < ApplicationController 

    def get_a_thingy 
    if Thingy.count <= 5 
     # Only five thingies left! we need to generate some more. 
     # I want to dynamically send a block to an after_filter: here to 
     # generate thingies after the controller sends the response 
     # because generating thingies is really slow 
    end 

    # Pop the first thingy from the database and return 
    thingy = Thingy.first 
    thingy.delete 
    return thingy.content 
    end 

答えて

0

ちょうどあなたのafter_filterコード内の鮫の数をチェックif文を置く:

class ThingyController < ApplicationController 
    after_filter :generate_new_thingies 

    def get_a_thingy 
    thingy = Thingy.first 
    thingy.delete 
    return thingy.content 
    end 

    def generate_new_thingies 
    if Thingy.count <= 5 
     # Generate thingies 
    end 
    end 
end 

は本当に長いページが読み込まれるのを防ぐafter_filterを使用していますか? Delayed JobまたはWheneverのようなものを見る方が良いかもしれません。

+0

私も驚いていましたが、 'thingy.delete'はうまくいくようです。私は、通常の方法でフィルタを追加する必要があると感じていました。アクションが「get_a_thingy」の場合にのみフィルタを実行できる方法はありますか?コントローラが実行するすべてのアクションに対してThingy.countを照会する必要はありません。ありがとう! – ukoki

+0

haha​​ nevermind ..私自身の質問に答えました: 'after_filter:generate_new_thingies、:only =>:get_a_thingy' – ukoki

1

いくつかのバックグラウンド処理ツール(https://www.ruby-toolbox.com/categories/Background_Jobsがこれをチェックします)を試すと、リクエストハンドラ内で実行できるかどうかわからないことがあります。

また、すべてのコンテンツを(httpストリーミングのようなsmthingを介して)ユーザーに返して、重いものだけを返そうとすることもできます。

+0

あなたは正しいです。私は 'after_filter'に' sleep 5'を追加することでそれをテストしました。本当にすべてのフィルタが応答を送る前に終了するのを待っています。 – ukoki

0

おそらく、最高のアイデアは、delayed_jobのような宝石になります。railscastもあります。

遅延ジョブは、非同期優先キューシステムです。

  • delayed_jobをインストールして設定します。 github pageにはかなり詳しく書かれています。

  • スタートrake jobs:work

  • と労働者は今、単に.delay方法

class ThingyController < ApplicationController 
    after_filter :generate_thingies 
    . 
    . 
    . 
    def generate_thingies 
    if Thingy.count <= 5 
     #change 
     Thingy.generate_thingies 
     #to 
     Thingy.delay.generate_thingies 
    end 
    end 
end 

にメモを追加することにより、遅延ジョブを使用するようにコードを変更します。これは、小さなチュートリアルと私は左あなたがそれを働かせるために必要なものをいくつか出してください。 Githubのページで詳細なドキュメントを確認することをお勧めします。

関連する問題