2013-07-26 30 views
1

在Rails 4.0中,我有這個表,我想按照location_id的出現次數對它進行排序。在這種情況下,最流行的location_id是3.我想按照降序對我的表進行排序,從頂部帶有location_id:3的所有記錄開始。按數據庫中發生的次數排序記錄

表Geochecks-

┌────┬─────────┬─────────────┬─────────────────────┬────────────────────┬─────────────────────┐ 
│ id │ user_id │ location_id │ message    │ created_at   │ updated_at   │ 
├────┼─────────┼─────────────┼─────────────────────┼────────────────────┼─────────────────────┤ 
│ 1 ╎ 14  ╎ 2   ╎ Test test t   ╎ 2013-07-23 13:3... ╎ 2013-07-23 13:37... │ 
│ 2 ╎ 12  ╎ 3   ╎      ╎ 2013-07-23 13:5... ╎ 2013-07-23 13:54... │ 
│ 3 ╎ 15  ╎ 2   ╎ <html lang="en" ... ╎ 2013-07-25 08:5... ╎ 2013-07-25 08:57... │ 
│ 4 ╎ 12  ╎ 3   ╎ Ohohohooh   ╎ 2013-07-25 11:3... ╎ 2013-07-25 11:37... │ 
│ 5 ╎ 12  ╎ 3   ╎ Pff kjasakljdfas... ╎ 2013-07-25 11:3... ╎ 2013-07-25 11:37... │ 
│ 6 ╎ 15  ╎ 4   ╎      ╎ 2013-07-25 13:5... ╎ 2013-07-25 13:54... │ 
│ 7 ╎ 13  ╎ 4   ╎ dasfdasfdasfdasf ╎ 2013-07-25 14:3... ╎ 2013-07-25 14:30... │ 
│ 8 ╎ 13  ╎ 3   ╎      ╎ 2013-07-25 14:3... ╎ 2013-07-25 14:30... │ 
│ 9 ╎ 13  ╎ 2   ╎ Test check message ╎ 2013-07-25 14:3... ╎ 2013-07-25 14:31... │ 
│ 10 ╎ 13  ╎ 5   ╎ asdfdasfdasfdasfa ╎ 2013-07-25 14:4... ╎ 2013-07-25 14:42... │ 
│ 11 ╎ 16  ╎ 7   ╎ Hohohooh   ╎ 2013-07-26 07:5... ╎ 2013-07-26 07:50... │ 
└────┴─────────┴─────────────┴─────────────────────┴────────────────────┴─────────────────────┘ 

我知道如何指望他們在由前:Geochecks.where(location_id: 3).count #=> 4,想着一個循環會做.where().count請求通過整個表,之後比較結果找到最大的一個,但我確信有一個更聰明的解決方案。

期望的輸出:期望的輸出應該是降序的location_id列表。在這種情況下,它應該是:3, 2, 4, 5, 7

+0

我認爲你需要有一個SQL查詢,你首先執行組,計數和順序,然後再把這個查詢的結果連接到表中,以便將它用作一個順序。 –

+0

我不太瞭解SQL查詢。你能否給我提供任何例子?謝謝 –

+0

這就是要點。如果你不知道如何去做,我會鼓勵你先學習SQL。做你不明白的事情是不行的。你可以嘗試一下,使用Rails執行此操作,讓我寫一個答案。 –

回答

1

所以,用SQL做它,因爲我在評論中指出會相當複雜,需要SQL的良好的知識。但在rails c有一段時間,我找到了一種在Rails中實現的方法! 此查詢的結果將是位置不是地理位置,但我不認爲這會對您造成問題。

Location.joins(:geochecks).order('COUNT(geochecks.id) DESC').group('location.id') 
+0

這一個簡單地返回我的位置表的默認順序。不太清楚,這對排序Gechecks –

+0

有幫助我只想根據每個位置的出現次數以降序輸出location_ids的列表。我會在上面放置所需的輸出。 –

+0

好的,如果你運行'Location.joins(:geochecks).order('COUNT(geochecks.id)DESC').group('location.id')。map(&:geochecks).map(&:count )'你會得到一組降序的值嗎?請在評論中添加此結果! –

0

,我認爲它應該工作:

Table.find(:all, :order => "location_id_count DESC") 
+0

當我嘗試這個控制檯時返回錯誤:SQLite3 :: SQLException:沒有這樣的列:location_id_count。所以它不明白_count是什麼意思 –

+0

是的,你如何期待這個工作? –