Упорядочить таблицу путем группировки значений в другой таблице - PullRequest
1 голос
/ 16 февраля 2011

У меня есть таблица вопросов: название На каждый вопрос есть ответы, в другой таблице: text, question_id Каждый ответ имеет голоса, в другой таблице: answer_id

Я могу попросить общее количество голосов с

question.votes.count

Я видел, как группировать голоса в БД http://guides.rubyonrails.org/active_record_querying.html#group

Vote.group("answer_id")

Но я хочу заказать свои вопросы по голосам. Это упорядочение массива из таблицы посредством группировки другой таблицы. Это возможно?

q=Question.last
q.answers.order_by_vote #How to do this?

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

Спасибо.

Ответы [ 2 ]

1 голос
/ 14 октября 2011

Я только что нашел способ упорядочить свои ссылки по количеству голосов, используя метод сортировки в моем представлении ссылок:

<% @user.links.sort { |a, b| b.votes.sum(:score) <=> a.votes.sum(:score) }.each do |link| %>

количество голосов, которое конкретная ссылка имеет из таблицы голосов.

надеюсь, это поможет.

1 голос
/ 16 февраля 2011

Во-первых, я думаю, что вы имеете в виду таблицу, когда говорите БД (база данных). Таблица - структура внутри базы данных, которая содержит данные для конкретной модели, например (вопросы, голоса и ответы. В вашем случае у вас есть три таблицы.

Во-вторых, вызов attr_accessible: answer_id не делает атрибут доступным для поиска по индексу. Этот атрибут доступен для поиска независимо от того, объявляете ли вы его доступным. Это не индекс, если вы не укажете его как индекс в базе данных. attr_accessible означает, что атрибут может быть установлен с помощью массового назначения, например, когда вы вызываете update_attributes.

Наконец, если вы хотите сгруппировать по answer_id и упорядочить по количеству голосов, вы можете сделать это с помощью следующего запроса:

Vote.select('count(id) as votes, answer_id').group('answer_id').order('votes DESC')

Если вы хотите упорядочить по какому-либо другому значению, кроме того, по которому вы группируете, вам придется добавить это и в свою группу. Это гарантирует, что вы не получите произвольные результаты для второго значения. Например:

Vote.group('answer_id').group('column_1').order('column_1 DESC')
...