2011-09-09 22 views
1

我使用的查找方法如下:什麼Rails的ActiveRecord的找到返回

@records = Effort.find(:all, 
         :select => 'full_name, taskType, sum(hours)', 
         :group => 'full_name, taskType', 
         ... 
@records.each do |record| 

查詢工作正常。我感到困惑的是如何訪問總和(小時)值。我試過以下內容:

record.sum(hours) # undefined local variable hours 
record.sum_hours # sum_hours undefined 
record[2]   # Gives empty string 
record[3]   # Same, just double checking where the index might start... 

我有點卡住如何訪問該值!如果我添加<%= debug @records %>我的看法,我看到調試輸出像這樣:

--- 
- !ruby/object:Effort 
    attributes: 
    full_name: admin 
    taskType: Pre-Sales 
    sum(hours): '16' 
+0

你可以試試sum_hours_嗎?我認爲AR用下劃線替換所有符號。 – Augusto

+0

遺憾的是沒有 - 未定義的方法sum_hours_ – asc99c

+4

您是否嘗試過使用別名是什麼?例如。 ':選擇=>「FULL_NAME,任務類型,總和(小時)total_hours'',然後你可以訪問它呼籲'record.total_hours'。無論如何,我不確定。 –

回答

2

你到底是想實現這個查詢呢?你是想得到所有的Effort的小時的總和還是通過其他方式分組?

下面

@records = Effort.find(:all, 
         :select => 'full_name, taskType, sum(hours)', 
         ... 

查詢將永遠只能返回值爲1,因爲你選擇的sum(hours)那裏,這會導致SQL綜合這些結果到第一行。這意味着您將始終獲得您的第一個Effort行,並且sum(hours)字段將設置爲花費在所有努力上的總時間。如果你正在尋找總結小時基於一些其他標準,請更新您的問題

Effort.sum(:hours)

如果你只是希望所有Effort小時的總和,你可以做到這一點。

編輯

在這種情況下,你可以做這樣的事情,

@records = Effort.group(:full_name, :taskType).sum(:hours)

你會用哈希看起來像這樣結束:

[full_name, taskType] => count

ie

['baking cookies', 'baking'] => 12 
['baking cakes', 'baking'] => 2 
... 

你可以遍歷它想:

@records.each do | (full_name, task_type), hours | 
    puts 'Full Name: #{full_name}, Task Type: #{task_type}, Total Hours: #{hours}' 
end 
+0

。如果您需要多行,您必須使用像group()這樣的集合函數,正如我在另一個問題中已經指出的那樣。對於這樣複雜的計算,參見[計算](http://ar.rubyonrails.org/classes/ActiveRecord/Calculations/ClassMethods.html) –

+0

是的,我使用一組由所述選擇子句的其他兩個字段 - 我試圖儘量減少我的問題向有關部分 – asc99c

+0

asc99c,我已經更新了我的答案,看看是否有幫助 –

0

不知道,如果它的工作原理,但你可能想試試這個:

@sums = Effort.sum(:hours, 
        :group => [:project_task_id, :user_id], 
        :joins => [:project_task, :user]) 

它應該給你一組記錄。然後,您應該通常能夠收集這些:

@array = @sums.collect do |aggregate| 
      [aggregate.project_task.name, aggregate.user.name, aggregate.hours] 
     end 
0

雖然回頭看我的文章和調試輸出,它突然發生,我就在那裏頁面上:

record.attributes[ 'sum(hours)' ] 

我猜想像record.full_name這樣的東西真的是一種訪問屬性數組的便利方法嗎?

+0

是的,它會查看你的屬性,並從屬性哈希中獲取適當的鍵。如果你有工作先走了,我建議你只是採取了快速看一下我的更新的解決方案,看看是否可以清理你的代碼位。 –

相關問題