Как лучше ранжировать модели в rails

Допустим, у меня есть Posts и Comments для приложения для блога, использующего Rails и MySQL.

Я хочу ранжировать сообщения по количеству комментариев. (Примечание: не просто сортировать, а получить фактический 1-й, 2-й, 3-й ранг).

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

например «Этот пост занимает 372-е место по количеству комментариев»

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

Я нашел несколько умных решений для этого в MySQL, таких как этот пост: in-mysql">Как справиться с совпадениями при ранжировании результатов в MySQL?

Мне интересно, есть ли более простое решение путем нормализации некоторых данных в дополнительном поле в таблице сообщений.

Кто-нибудь видел хороший подход для этого?


person Brian Armstrong    schedule 12.04.2011    source источник
comment
Определить ранг. Вы всегда можете кэшировать количество комментариев в столбце кеша счетчика в сообщении и искать максимальное количество комментариев, но без более подробного требования ранжирования я не могу думать ни о чем другом.   -  person Srdjan Pejic    schedule 12.04.2011


Ответы (2)


Размышляя об этом подробнее, я думаю, что есть несколько разных способов добавления этой функциональности.

Вы можете либо добавить Redis в этот микс, либо использовать его функции отсортированного набора, как в примере с лучшим результатом в этом посте, http://jimneath.org/2011/03/24/using-redis-with-ruby-on-rails.html

Это, наверное, лучший дизайн, на мой взгляд. Вы отделяете часть анализа от части сбора данных и используете Redis в том, в чем он лучше всего.

Другой способ — создать модель PostRanking, которая записывает post_id и количество комментариев. Вы можете установить для этого область по умолчанию, чтобы сортировать по количеству комментариев в порядке убывания и легко запрашивать их.

person Srdjan Pejic    schedule 12.04.2011

Эта проблема выглядит идентично примеру, приведенному для параметра ассоциации :counter_cache.

Посмотрите.

person phaedryx    schedule 20.09.2012