如何在特定时间范围内限制现有的Rails AR查询?

时间:2013-11-29 04:49:55

标签: ruby-on-rails ruby-on-rails-4 rails-activerecord

我在Rails应用程序中有一个仪表板(esque)视图,它以类似的方式显示一些数据,但分为多个时间段。

我的控制器中有一些代码如下:

@issues_this_month = Issue.where('issues.created_at BETWEEN ? AND ?', DateTime.now.in_time_zone.beginning_of_month, DateTime.now.in_time_zone.end_of_month)

我还想创建一个变量来显示今年的问题并一直发布所以我有这个代码:

@issues_this_year = Issue.where('issues.created_at BETWEEN ? AND ?', DateTime.now.in_time_zone.beginning_of_year, DateTime.now.in_time_zone.end_of_year)

我很好奇是否有人可以想出一个好的方法来做一个查询,并从中推断出日期范围,同时避免额外的查询。我应该将结果传递给辅助方法并在那里执行逻辑吗?

2 个答案:

答案 0 :(得分:1)

在模型中......你可以定义

def date
  self.created_at.to_date
end

然后在控制器中

start = Date.today.beginning_of_year
end = Date.today.end_of_year
@issues_this_year = Issue.where(create_at: start..end).group_by(&:date)

现在您的哈希值为[month_1,{存在于month_1中的问题},month_2,{存在于month_2中的问题}等。在控制台中使用它来找到正确的键... @issues_this_year.keys

答案 1 :(得分:-1)

如何定义像

这样的方法
def self.in_timeframe(start_time=DateTime.now.in_time_zone.beginning_of_month,
                 end_time=DateTime.now.in_time_zone.end_of_month)
  Issue.where('issues.created_at BETWEEN ? AND ?', start_time, end_time)
end

您现在可以按如下方式调用它:

Issue.in_timeframe # For issues in the month
Issue.in_timeframe(x,y) # For issues within x-y timeframe

如果您想在单个查询中使用数据,则可以执行以下操作:

def self.in_timeframes(time_frames)
  data = {}
  times_frames.each do |time_frame|
    data[time_frame[:name]] = Issue.in_timeframe(time_frame[:srtart]. time_frame[:end])
  end
  data
end

您可以使用以下方法调用上述方法:

time_frames = [{:name=>"month"},
               {:name=>"x-y", :start=>x, :end=>y}]
Issue.in_timeframes(time_frames)