Как сделать период запроса с месяцем, кварталом или годом? - PullRequest
0 голосов
/ 02 июля 2018

Я создаю веб-приложение в Rails 5. В этом приложении я хочу запросить объект с именем Measure, который имеет атрибут Data_at (datetime). В моем пользовательском интерфейсе я позволяю пользователю выбирать из трех разных периодов (месяц, квартал и год).

Когда они выбирают Месяц следующий, им нужно выбрать, какой месяц (от 1 до 12). Когда они выбирают Квартал, им нужно выбрать четверть (1,2,3 или 4). Когда они выбирают Год, они должны выбрать, какой год.

Я ищу способ сделать этот запрос на бэкэнде (контроллер и модель) на основе выбранных данных.

Когда я делаю месяц, я думаю, что могу использовать begin_of_month и end_of_month.

Когда я делаю четверть, я думаю, что могу использовать функции rails begin_of_quarter и end_of_quarter, но как будет выглядеть такой запрос. У меня есть данные от пользователя, какой квартал они выбрали (от 1 до 4) и какой год они выбрали.

Это моя текущая попытка.

Запрос

def self.select_data(params)
    if params[:period] == "month"
      month_dates(params[:month], params[:year])
    elsif params[:period] == "quarter"
      quarter_dates(params[:quarter], params[:year])
    elsif params[:period] == "year"

    end
  end

Методы модели

def month_dates(month, year)
    date = Time.parse("01-#{month}-#{year}")
    where(date_at: date.beginning_of_month..date.end_of_month)
  end

  def quarter_dates(quarter, year)
    if quarter == 1
      where(date_at: Time.parse("01-01-#{year}")..Time.parse("01-03-#{year}"))
    elsif quarter == 2
      where(date_at: Time.parse("01-04-#{year}")..Time.parse("01-06-#{year}"))
    elsif quarter == 3
      where(date_at: Time.parse("01-07-#{year}")..Time.parse("01-09-#{year}"))
    elsif quarter == 4
      where(date_at: Time.parse("01-10-#{year}")..Time.parse("01-12-#{year}"))
    end
  end

  def year_dates(year)
    date = Time.parse("01-01-#{year}")
    where(date_at: date.beginning_of_year..date.end_of_year)
  end

1 Ответ

0 голосов
/ 02 июля 2018

Запрос сводится к where(column: Range) условию:

@measures = Measure.where(data_at: selected_period)

Тогда нужно выбрать правильный диапазон для ваших входов:

def selected_period
  case params[:period]
  when "year"
    Date.new(params[:year].to_i).all_year
  when "quarter"
    # It seems like there should be a nicer way to spell this :/
    Date.new(params[:year].to_i, 3 * params[:quarter].to_i - 2).all_quarter
  when "month"
    Date.new(params[:year].to_i, params[:month].to_i).all_month
  end
end
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...