Если вашему приложению нужно знать, есть ли у пользователя какие-либо вызовы, ожидающие при каждой загрузке страницы, и эта информация хранится только в базе данных, тогда да, я бы ожидал, что вам придется запросить в базе данных эту информацию при каждой загрузке страницы.
Что касается DRYness, Rails предоставляет множество механизмов по всему стеку MVC, которые гарантируют, что все будет СУХОЙ и поддерживаемой:
В модели вы можете добавить метод класса в модель 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
Используйте параметры before_filter, такие как: кроме и: только, чтобы точно определить использование фильтра в определенных действиях контроллера. Кроме того, объявляя фактические методы load_current_users_calls в ApplicationController, гарантирует, что каждый субклассированный контроллер имеет этот метод, вам не нужно помещать объявление before_filter в ApplicationController - вы можете просто поместить его в любой контроллер, который вы хотите запустить before_filter.
А в слое вида вы можете сделать частичное, чтобы легко отображать @calls в вашем стандартном макете. Вы можете добавить что-то вроде этого в свой макет:
<%- if @calls && !@calls.blank? -%>
<%= render :partial => 'awaiting_calls_display', :locals => {:calls => @class} =%>
<%- end -%>
Или, если это не вписывается в ваш макет, вы можете вызвать его из любого подходящего представления.