Я еще не смог протестировать этот SQL в вашей модели, но вы можете попробовать:
select articles_ratings.*, likes/total rating from (select articles.*, SUM(if(articles.like, 1, 0)) likes, count(*) total from articles JOIN ratings on article_id = articles.id GROUP BY articles.id) articles_ratings ORDER BY rating desc
Надеемся, это даст вам список статей, отсортированных по их рейтингу (по убыванию). Я могу попробовать с некоторыми рельсами, если это сработает.
РЕДАКТИРОВАТЬ Как подсказывает @socjopa, если вы не пытаетесь немедленно запустить его в производство, моей следующей рекомендацией будет перенести этот запрос в представление. Относитесь к нему, как к любому другому ActiveRecord
, и соответственно связывайте его с вашими статьями.
При наличии соответствующих индексов представление должно быть достаточно быстрым, но на самом деле может не потребоваться каждый раз вычислять значение рейтинга во время выполнения. Возможно, вы также захотите сохранить столбец рейтинга в таблице «Статьи», если производительность не там, где вам нужно. Вы можете просто обновить этот рейтинг всякий раз, когда рейтинг статьи изменяется или создается.
Тем не менее, это исполнение должно быть днем и ночью в течение вашей текущей итерации.