Я хотел зайти и предложить другой способ, возможно, немного более родной RoR.: -)
@ user = User.find_by_username (params [: username],: include => [{: questions =>: голоса}]) @sorted_questions = @ user.questions.sort {| q1,q2 |q2.votes.length <=> q1.votes.length}
Это имеет ряд преимуществ:
1) SQL не написан, поддерживает переносимость БД, легче для чтения (?) 2) Освобождает БД от сортировки вычислений, лучше масштабируется
и имеет ряд недостатков:
1) Работает на Ruby тяжелее, большая задержка при низких нагрузках, менее эффективна на одном блоке 2) Перемещает больше данных, потенциально уменьшает преимущество # 2
В идеале, вы хотели бы взглянуть на функциональность счетчика ActiveRecord.Он автоматически кэширует счетчик отношений путем денормализации количества дочерних строк в родительскую таблицу.Чтобы все работало, все дочерние операции со строками должны происходить через родительский объект, но в любом случае это лучшая практика Rails.
Наличие кэша счетчика голосов в вопросах избавит от необходимости ссылаться на таблицу голосов в запросе.,Выполнение этого и сортировка в Ruby могут быть идеальной ситуацией как с точки зрения производительности, так и с точки зрения эстетики кода.
Наконец, я должен допустить, что в Rails 3 есть очень крутые вещи в реляционной алгебре.С этим, вероятно, это мог бы быть супер читаемый однострочный, который генерирует оптимальный SQL.Как круто это будет?: -)