我正在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
答案 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