2

在Rails中,可以使用:如何對最後的N個結果進行分組和計數?

Model.group(:字段).Count之間

,得到類似:

{ 「一個」=> 7,「 b「=> 5, 」C「=> 3 」d「=> 3, 」E「=> 4}

但是我怎樣才能只在計數最後N行,不是整個表,用數據庫做計算?

不起作用:

Model.limit(100)。集團(:字段).Count之間

限制將限制散列輸出鍵不使用的表線

Model.last(100).group(:field).count

最後返回數組併產生錯誤

我使用: *紅寶石2.3.3p222 * Rails的4.2.4 *第9.5.6

+1

這應該工作:'Model.where(ID:Model.limit(100)。選擇(:ID))組。(:場).count' – AbM

+0

@AbM我只能說:爆頭!請使用「答案」我可以接受嗎? –

回答

2

正如你提到的,limit是被應用在分組的情況下,而不是實例本身。一個簡單的解決方法是:

Model.where(id: Model.limit(100).select(:id)).group(:field).count

+0

我們忘了**訂單**以獲得最後結果: > Vote.where(id:Vote.limit(100).select(:id).order(created_at :: desc))。group(:emotion )。計數 –

1

Array對象也可以使用group_by進行分組:

grouped = Model.last(100).group_by(&:field).map { |k,v| [k, v.length] } 

這將返回以下矩陣:

#=> [["Field value 1", value_1_count], ["Field value 2", value_2_count], etc...] 

矩陣也可以變成有H:

grouped.each_with_object({}) { |value, memo| memo[value[0]] = value[1] } 

綜上所述,請嘗試以下操作:

Model.last(100) 
    .group_by(&:field) 
    .each_with_object({}) { |(key, value), memo| memo[key] = value.length } 
+0

您發佈了一個非常好的答案,並公平我必須接受它。但是我會更新這個問題,因爲我錯誤地忽略了一個非常重要的信息:不是在數組中,而是在SQL中(因此基數將進行計算。與數據庫,而不是一個數組(紅寶石)計算。 我可以有這個? –

相關問題