期间如何查询月份,季度或年份?

时间:2018-07-02 12:46:32

标签: ruby-on-rails

我正在Rails 5中构建一个Web应用程序。 在这个应用程序中,我想查询一个名为Measure的对象,该对象具有Data_at(日期时间)属性。在用户界面中,我让用户从三个不同的期间(月,季度和年)中进行选择。

当他们选择下一个月时,他们需要选择哪个月(1到12)。 当他们选择季度时,接下来必须选择季度(1、2、3或4)。当他们选择年份时,下一个必须选择年份。

我正在寻找一种基于所选数据在后端(控制器和模型)上进行此查询的方法。

在做月份时,我认为我可以使用“开始月份”和“结束月份”。

当执行季度时,我认为我可以使用begin_of_quarter和end_of_quarter rails函数,但是这样的查询看起来如何。我从用户那里获得的数据是他们选择的季度(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 :(得分:1)

查询可归结为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