2013-07-26 3 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! Результатом этого запроса будет Locations not Geochecks, но я не думаю, что это будет проблемой для вас.

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

Да, как вы ожидаете, что это сработает? –

Смежные вопросы