2012-12-03 58 views
1

的陣列使用

Ruby 1.9.3-p194 
Rails 3.2.8 

這是我所需要的。
計算不同的人力資源(human_resource_id)並將其除以分配總數(assignment_id)。 因此,對於虛擬數據回答下面給出的應該是:每人力資源 數列的唯一行的對象

1.5分配,但我就是不知道哪裏去了。
這裏是我的嘗試:

表名:分配

id  | human_resource_id | assignment_id | assignment_start_date | assignment_expected_end_date 
80101780 | 20200132   | 80101780  | 2012-10-25   | 2012-10-31 
80101300 | 20200132   | 80101300  | 2012-07-07   | 2012-07-31 
80101308 | 21100066   | 80101308  | 2012-07-09   | 2012-07-17 

起初,我需要爲我需要「看」的時期選擇。這總是從一年前的最大值開始。

a = Assignment.find(:all, :conditions => { :assignment_expected_end_date => (DateTime.now - 1.year)..DateTimenow }) 
=> [ 
#<Assignment id: 80101780, human_resource_id: "20200132", assignment_id: "80101780", assignment_start_date: "2012-10-25", assignment_expected_end_date: "2012-10-31">, 
#<Assignment id: 80101300, human_resource_id: "20200132", assignment_id: "80101300", assignment_start_date: "2012-07-07", assignment_expected_end_date: "2012-07-31">, 
#<Assignment id: 80101308, human_resource_id: "21100066", assignment_id: "80101308", assignment_start_date: "2012-07-09", assignment_expected_end_date: "2012-07-17"> 
] 

foo = a.group_by(&:human_resource_id) 

現在我得到了一個漂亮的'對象散列數組',我只是不知道接下來要做什麼。

有人可以幫助我嗎?

回答

2

您可以嘗試在執行SQL請求:

ActiveRecord::Base.connection.select_value('SELECT count(distinct human_resource_id)/count(distinct assignment_id) AS ratio FROM assignments'); 
+1

這很好,我認爲它使用ActiveRecord :: Base.connection.select_value而不是執行,以避免必須通過PGresult對象。 –

+0

你說得對,我已經更新了我的回答 – Baldrick

+0

感謝您的快速回復,我只認爲日期範圍缺失,我想?我在哪裏可以選擇時間範圍::assignment_expected_end_date =>(DateTime.now - 1.year).. DateTime.now –

1

你可以做類似

human_resource_count = assignments.collect{|a| a.human_resource_id}.uniq.count 
assignment_count = assignments.collect{|a| a.assignment_id}.uniq.count 

result = human_resource_count/assignment_count 
+0

這將加載整個表中的Rails應用程序。我認爲'Assignment.select(:human_resource_id).uniq.count'和'Assignment.select(:assignment_id).uniq.count'會更好 – Baldrick

+0

是的,儘管你可以做Assignment.select(:human_resource_id,:assignment_id)和然後使用我提供的行,這將避免在內存中加載太多並防止多個數據庫調用。無論哪種方式,您在SQL中執行整個任務的建議可能會更好,因爲它會更快,並且不會將任何內容加載到rails內存中。 –

+0

感謝您的回答,但是與Baldrick相同的問題,我可以在哪裏輸入此選擇的DateTime範圍? –