Заказ пользователей с большинством песен - PullRequest
1 голос
/ 21 июля 2011

Надеюсь, простой вопрос. У меня есть несколько моделей, две из них, :users и :songs, взаимодействуют для получения данных из базы данных.

Пользователь has_many :songs.

Я пытаюсь найти пользователей с наибольшим количеством песен в действии USER INDEX, то есть список 10 пользователей с наибольшим количеством песен, пользователя с наибольшим количеством песен вверху, по убыванию.

Пока у меня есть в users_controller в index;

@users = User.all

И пока все, что я могу сделать в представлении, users/index;

<% @users.each do |user| %>
<%= user.name %><%= user.songs.count %>
<% end %>

Работает, подсчитывает песни, но как мне сделать заказ пользователям с большинством песен?

Я смотрю на sort_by внутри блока и думаю, что это можно сделать, перечислив все песни и сгруппировав их по пользователю, но я чувствую, что это недостаточно эффективно. - как видите, я не продвинутый разработчик.

Пожалуйста, скажите мне, что вы, ребята, думаете, и ответьте на мое решение, если это возможно. Меня смущает то, что я упорядочиваю список, сгенерированный из таблицы, по данным, сгенерированным другой таблицей. Должно быть, все просто, но я раньше этого не делал, поэтому не могу обойти это.

Заранее спасибо.

Ответы [ 2 ]

2 голосов
/ 21 июля 2011

Вы должны использовать что-то вроде этого:

User.includes(:songs).order{|x| x.songs.size}

Это делает все в одном запросе, поэтому оно должно быть более эффективным, чем, например,

User.all.sort{|x| user.songs.size}

, который будет выполнять запрос для каждогопользователь

1 голос
/ 21 июля 2011

Как насчет

User.all(:limit => 10, :order => "(select count(user_id) from songs where user_id = users.id) DESC")
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...