1

我正在尝试为某个日期范围生成统计信息。例如,我有一个带有“持续时间”属性的项目模型。用户可以从菜单中选择三个不同的值:

  • 学年
  • 学期
  • 夏季学期

这是我目前在搜索控制器中的内容:

def index
  unless params[:from].nil? and params[:to].nil?
    @result = Project.where('start_date >= ? AND start_date <= ?', Date.strptime(params[:from], "%m/%d/%Y"), Date.strptime(params[:to], "%m/%d/%Y"))
...
end

这让我得到了所有项目的数组,但我无法将该数组转换为统计数据。

我想获得持续时间为学年的项目总数、持续时间为学期的项目总数和持续时间为夏季学期的项目总数。

代码必须足够灵活,如果稍后我将“一个月”添加到选项列表中,代码就会选择它。

我以前用金额做过,但不是用字符串值:Rails 3. Get totals from array

结果将类似于以下内容:

** Duration **
Academic year: 12
Semester: 9
Summer term: 5

** Course Disciplines **
Dental: 11
Biomedical: 3
Nursing: 7

** many more other attributes ***

谢谢!

4

4 回答 4

0

Ruby 在 Array 类上有一个很棒的 select 方法,所以你可以做这样的事情:

a = [1, 3, 10, 20, 50]

results = a.select {|item| item > 3}

puts results

#->[10, 20, 50]

使用它,您可以设置一些复杂的要求,然后对结果数组进行计数。

值得注意的是,如果您必须经常为很多项目执行此操作,则可能值得将统计信息存储在另一个表或系统中,该表或系统在后台(例如通过 resque)或创建/更新时更新。

于 2013-06-28T02:55:07.737 回答
0

添加

attr_accessor :total

要投影模型并更改您的查询,如下所示:

 @result = Project.select("duration, count(*) as total").group("duration").where('start_date >= ? AND start_date <= ?', Date.strptime(params[:from], "%m/%d/%Y"), Date.strptime(params[:to], "%m/%d/%Y"))
于 2013-06-28T03:02:28.727 回答
0

那不是简单地找到所有持续时间=“学期”的项目,然后对返回的数组进行计数吗?

于 2013-06-27T21:10:43.797 回答
0

假设在调用 #duration 时,@result 的每个实例都返回一个字符串(或者更好的是一个符号),这应该可以帮助您入门:

# Sample data for example, use an OpenStruct to simulate the model
require 'ostruct'
@result = (["Academic year"] * 12 + ["Semester"] * 9 + ["Summer Term"] * 5).map { |a| OpenStruct.new(duration: a) } 

durations = @result.to_a.inject(Hash.new(0)) { |a, p| a[p.duration] += 1; a }
# => {"Academic year"=>12, "Semester"=>9, "Summer Term"=>5}
于 2013-06-27T23:29:22.887 回答