Арел: порядок по количеству ассоциаций

Вот что я пытаюсь сделать

class Question
  has_many :votes
end

class Vote
  belongs_to :question
end

Я хочу найти все вопросы, упорядоченные по количеству голосов, которые они имеют. Я хочу выразить это в Arel (в Rails 3) без использования кэшей счетчиков.

Есть ли способ сделать это?

Спасибо.


person Akshay Rawat    schedule 12.09.2011    source источник


Ответы (2)


Попробуй это:

Question.select("questions.*, a.vote_count AS vote_count").
 joins("LEFT OUTER JOIN (
    SELECT b.question_id, COUNT(b.id) AS vote_count
    FROM   votes b
    GROUP BY b.question_id
  ) a ON a.question_id = questions.id")

Решение не зависит от БД. Убедитесь, что вы добавили индекс в столбец question_id в таблице votes (вы должны добавить индекс, даже если вы не используете это решение).

person Harish Shetty    schedule 12.09.2011

Попробуйте следующее:

Question.joins(:votes).select("questions.id, *other question coulmns*, count(votes.id) as vote_count").order("vote_count DESC").group("questions.id")
person bor1s    schedule 12.09.2011
comment
ты хотел сказать group("questions.id")? - person Wizard of Ogz; 12.09.2011
comment
Есть ли простой способ получить *other question columns* в файле select. Я думаю, что это понадобится и в group(). - person Akshay Rawat; 12.09.2011
comment
@Akshay Rawat, возможно, попробуйте вопросы.* - person bor1s; 12.09.2011
comment
Как контрапункт, этот тип сложного запроса — это то, где сияет SQL, и вы можете захотеть изучить использование чистого SQL для этого. - person MattC; 13.09.2011