Как упорядочить массив по связанному целому числу в Ruby on Rails? - PullRequest
1 голос
/ 19 июня 2010

Я создаю самый популярный раздел активности для профилей пользователей. У меня нет проблем с переносом вопросов через user_id, но у меня возникают проблемы с переносом, а затем упорядочением по целому числу: question.votes.size. Это, вероятно, простой вопрос, но как мне отсортировать, а затем ограничить вывод до 3? Как мне сделать это, не отставая от базы данных? В конечном итоге будет подсчитано много голосов. Это должен быть named_scope?

    @user_id = User.find_by_username(params[:username]).id
    questions = Question.find(:all, :conditions => {:user_id => @user_id })

Ответы [ 2 ]

2 голосов
/ 19 июня 2010

Я хотел зайти и предложить другой способ, возможно, немного более родной 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.Как круто это будет?: -)

1 голос
/ 19 июня 2010

Я предполагаю, что у каждого вопроса есть много голосов.

Вы можете сделать это, используя

Question.find_by_sql("
  SELECT question.*, COUNT(votes.id) as vote_count 
   FROM questions 
   LEFT JOIN votes on questions.id = votes.question_id 
   GROUP BY questions.id 
   ORDER BY vote_count DESC
");

или что-то примерно эквивалентное этому (я не проверял это)

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...