2017-07-30 13 views
1

Ich habe 3 Modelle. Benutzer, Sprache, Link. Ein Link gehört einem Benutzer und einer Sprache. Ich möchte eine Liste der fünf aktivsten Sprachen auf der Startseite erstellen. Also möchte ich fünf Sprachen in der absteigenden Reihenfolge der Anzahl der verschiedenen Benutzer herausziehen, die Links unter dieser Sprache gepostet haben.Auftragssätze basierend auf der Anzahl der zugehörigen Datensätze von verschiedenen Benutzern in Schienen

Zum Beispiel. Spanisch hat 6 Links, die alle von 3 unterschiedlichen Nutzern gepostet werden. Moroccon hat 7 Links von 2 verschiedenen Nutzern gepostet. Französisch hat 5 Links von 5 verschiedenen Nutzern.

Die Reihenfolge der Sprachen muss also Französisch, Spanisch, Marokkanisch sein.

Hier ist die Modelle für jedes Objekt: -

class User < ApplicationRecord 
    has_many :links 

class Language < ApplicationRecord 
    belongs_to :user 
    has_many :links 

class Link < ApplicationRecord 
    belongs_to :user 
    belongs_to :language 

Ich bin ein Anfänger in Schienen, aber ich habe ein bisschen ausprobiert, um zu sehen, wie es gemacht werden kann.

Zum Beispiel probierte ich Link.select(:user_id).distinct.count, was in der Zählung der einzelnen Benutzer, die Links veröffentlicht haben. Aber ich weiß nicht, wie man die Sprachen auf der Grundlage der Zählung der unterschiedlichen Benutzer bestellt, die Verbindungen unter dieser Sprache bekannt gegeben haben. Hilfe wäre sehr willkommen.

+0

Welche Version von 'Rails' verwenden Sie? –

Antwort

1

Soweit ich verstehe, hat Sprache viele Benutzer durch Links. So können Sie einen has_many Verein Language

class Language 
    has_many :users, through: :links 
end 

hinzufügen und dann users Tabelle auf languages und Ordnung durch die Anzahl der Benutzer LEFT JOIN.

Da Rails 5left_joins Methode hat, kann es nur durch diese durchgeführt werden:

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

Wenn Sie nicht wollen, Sprachen ohne Links angezeigt werden, können left_joins durch joins ersetzt werden.

+0

Ich wunderte mich über die hat viele durch Assoziation, war mir nicht sicher, wie man es benutzt. Dies half bei der Klärung. Vielen Dank! – RawCode

Verwandte Themen