ユーザーがページの読み込みごとに待機している呼び出しがあるかどうかをアプリケーションが知る必要があり、その情報がデータベースにのみ保持されている場合は、はい、各ページでその情報をデータベースに照会する必要があると思います。ロード。
DRYnessに関する限り、RailsはMVCスタック全体に多数のメカニズムを提供し、物事をDRYおよび保守可能に保つことを保証します。
モデルでは、クラスメソッドをCallモデルに追加して、待機中の呼び出しをクエリするためのロジックをカプセル化できます。次のようになります。
class Call < ActiveRecord::Base
def self.awaiting_for_user user
self.all(:conditions => ['user_id = ? AND active = true', user])
end
このようなメソッドにクエリをカプセル化することで、その情報をクエリするための基になるロジックが変更されても、そのメソッドの呼び出しが変更されないようにします。
このメソッド呼び出しを各コントローラーアクション(index、showなど)に追加する代わりに、コントローラーのbefore_filter / around_filter / after_filtersメソッドを使用して、コントローラー/アクションのセットでこのコードを実行できます。
class ApplicationController
before_filter :load_current_user
before_filter :load_current_users_calls
....
protected
def load_current_user
# You could encapsulate this method in your User model
@user = User.find(session[:user_id])
end
def load_current_users_calls
@calls = Call.awaiting_for_user(@user)
end
:exceptや:onlyなどのbefore_filterオプションを使用して、特定のコントローラーアクションでのフィルターの使用を特定します。また、ApplicationControllerで実際のload_current_users_callsメソッドを宣言すると、サブクラス化された各コントローラーにそのメソッドが含まれるようになりますが、ApplicationControllerにbefore_filter宣言を配置する必要はありません。before_filterを実行する任意のコントローラーを配置できます。
また、ビューレイヤーでは、@callsを標準レイアウトで簡単に表示するために部分的に作成できます。次のようなものをレイアウトに追加できます。
<%- if @calls && !@calls.blank? -%>
<%= render :partial => 'awaiting_calls_display', :locals => {:calls => @class} =%>
<%- end -%>
または、それがレイアウトに合わない場合は、該当するビューから呼び出すことができます。