упорядочивать записи на основе количества связанных записей, размещенных отдельными пользователями в рельсах

У меня 3 модели. Пользователь, Язык, Ссылка. Ссылка принадлежит пользователю и языку. Я хочу создать список из пяти самых активных языков на главной странице. Итак, я хочу вывести пять языков в порядке убывания количества отдельных пользователей, разместивших ссылки на этом языке.

Например. Испанский имеет 6 ссылок, размещенных тремя разными пользователями. Марокко имеет 7 ссылок, размещенных двумя разными пользователями. У французского языка 5 ссылок, размещенных 5 разными пользователями.

Таким образом, порядок языков должен быть французский, испанский, марокканский.

Вот модели для каждого объекта: -

class User < ApplicationRecord
  has_many :links

class Language < ApplicationRecord
  belongs_to :user
  has_many :links

class Link < ApplicationRecord
  belongs_to :user
  belongs_to :language

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

Например, я попробовал Link.select(:user_id).distinct.count, что приводит к подсчету уникальных пользователей, разместивших ссылки. Но я не знаю, как упорядочить языки на основе количества отдельных пользователей, разместивших ссылки на этом языке. Помощь будет высоко оценена.


person RawCode    schedule 30.07.2017    source источник
comment
Какую версию Rails вы используете?   -  person Igor Drozdov    schedule 30.07.2017


Ответы (1)


Насколько я понимаю, язык имеет много пользователей по ссылкам. Таким образом, вы можете добавить ассоциацию has_many к Language

class Language
  has_many :users, through: :links
end

А затем осталось присоединиться к users таблице на languages и упорядочить ее по количеству пользователей.

Так как Rails 5 имеет метод left_joins, его можно выполнить вот так:

Language.left_joins(:users).group(:id).order("count(users.id) DESC").limit(5)

Если вы не хотите отображать языки без ссылок, left_joins можно заменить на joins.

person Igor Drozdov    schedule 30.07.2017
comment
Мне было интересно узнать о многих через ассоциации, я не знал, как его использовать. Это помогло уточнить. Спасибо! - person RawCode; 30.07.2017