Rails 3 - параметры запроса превращаются в вызовы Scope - PullRequest
0 голосов
/ 09 февраля 2011

Я создаю приложение, в котором есть несколько ежемесячных отчетов.Большинство из них очень похожи, и все они работают сейчас, но код отстой.Я должен очистить это и попытаться выяснить лучший подход в этом.

def active_monthly_total_by_type
    respond_to do |format|
      format.html
      format.json {
        @results = @current_account.items.totals_by_month(params[:selected_year], :status_change_date).with_type.active
        render :json => @results.collect{ |result| { :type => result.type, :jan => result.jan, :feb => result.feb, :mar => result.mar, :apr => result.apr, :may => result.may, :jun => result.jun, :jul => result.jul, :aug => result.aug, :sep => result.sep, :oct => result.oct, :nov => result.nov, :dec => result.dec } }
      }
    end
  end

  def active_monthly_total
    respond_to do |format|
      format.html
      format.json {
        @results = @current_account.items.totals_by_month(params[:selected_year], :status_change_date).active
        render :json => @results.collect{ |result| { :jan => result.jan, :feb => result.feb, :mar => result.mar, :apr => result.apr, :may => result.may, :jun => result.jun, :jul => result.jul, :aug => result.aug, :sep => result.sep, :oct => result.oct, :nov => result.nov, :dec => result.dec } }
      }

У меня есть 6 таких методов всего, и я пытаюсь выяснить, передам ли я параметр активногоили неактивен

params[:active]

, если я могу присоединить его к этому вызову

@results = @current_account.items.totals_by_month(params[:selected_year], :status_change_date).params[:active]

, если кто-то может помочь или дать мне совет, где я могу найти информацию, которую я хотел бы получить одним методомкоторый контролирует все эти вызовы, так как они одинаковы.Вот область применения модели:

def self.totals_by_month(year, date_type)
    start_date = year.blank? ? Date.today.beginning_of_year : Date.parse("#{year}0101").beginning_of_year
    end_date = year.blank? ? Date.today.end_of_year : Date.parse("#{year}0101").end_of_year
    composed_scope = self.scoped

    start_date.month.upto(end_date.month) do |month|
      composed_scope = composed_scope.select("COUNT(CASE WHEN items.#{date_type.to_s} BETWEEN '#{start_date.beginning_of_month}' AND '#{start_date.end_of_month}' THEN 1 END) AS #{Date::ABBR_MONTHNAMES[month].downcase}")
      start_date = start_date.next_month
    end

    composed_scope
end

1 Ответ

0 голосов
/ 19 февраля 2011

Я нашел уникальный способ сделать это. Я создал метод с именем pie_chart и bar_chart, который обрабатывает HTML и JSON для запросов, и реализовал эту структуру

/reports/:method/:year/:name/

send(params[:method],@current_account.items.send(params[:scope], params[:year]))

Где URL будет / reports / pie_chart / 2010 / count_types_by_year

У меня есть метод pie_chart в моем контроллере и count_types_by_year как область действия в моей модели, которая работает как шарм. Полностью делает ее динамичной, а также гибкой для новых дополнений ... DRY baby DRY

...