Rails 3:获取特定值的总数

时间:2013-06-27 21:00:03

标签: ruby-on-rails ruby

我正在尝试为特定日期范围生成统计信息。例如,我有一个Project模型,具有“duration”属性。用户可以从菜单中选择三个不同的值:

  • 学年
  • 学期
  • 夏季学期

这是我到目前为止在搜索控制器中所拥有的:

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 个答案:

答案 0 :(得分:0)

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

答案 1 :(得分:0)

假设@result的每个实例在调用#duration时返回一个字符串(或者更好的符号),这应该让你开始:

# 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}

答案 2 :(得分:0)

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

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

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

puts results

#->[10, 20, 50]

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

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

答案 3 :(得分: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"))