2013-06-27 35 views
1

我正在嘗試爲某個日期範圍生成統計信息。例如,我有一個Project模型,帶有「duration」屬性。用戶可以從菜單中三個不同值選擇:Rails 3:獲取特定值的總數

  • 學年
  • 學期
  • 夏季學期

這是我到目前爲止在搜索控制器:

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 *** 

謝謝!

+1

這看起來更像是一個比一個問題的請求。你嘗試了什麼? – NicoSantangelo

+0

已更新問題 – leonel

+0

@ result.count將爲您提供項目計數。刷新你的Ruby。 – HM1

回答

0

難道這不是簡單地找到所有的項目,其中duration =「Semester」,然後對返回的數組進行計數?

+0

是的,但我需要得到許多更多屬性的計數:課程紀律,服務時間,跨學科項目等 – leonel

+1

因此,編寫一個模型查詢以滿足您的任何需求。如果您有某個問題沒有按預期工作,我們可以回答,但我們無法預測您想要什麼,併爲您編寫代碼。請參閱查詢中的導軌指南 - http://guides.rubyonrails.org/v3.2.13/active_record_querying.html – HM1

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

紅寶石對Array類有很大選擇方法,以便你可以做這樣的事情:

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

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

puts results 

#->[10, 20, 50] 

使用這個你可以設置一些複雜的需求,然後只需運行所產生的陣列上的計數。

值得注意的是,如果您必須頻繁地處理大量項目,則可能需要將統計信息存儲在另一個表格或系統中,這些表格或系統會在後臺進行更新(例如,通過resque)或創建/更新。

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"))