2017-07-30 7 views
1

私は3つのモデルを持っています。ユーザー、言語、リンク。リンクはユーザーと言語に属します。私はホームページで最も活発な上位5言語のリストを作成したいと思っています。だから私は、その言語の下でリンクを掲示した別個のユーザーの数の多い順に5つの言語を引き出したいと思う。レール内の別のユーザーが投稿した関連レコードの数に基づいて注文レコード

たとえば、スペイン語は、3つの異なるユーザーが投稿した6つのリンクを持っています。 Morocconには2人の異なるユーザーが投稿した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を試したところ、リンクを投稿したユニークユーザー数がカウントされました。しかし、の言語を、その言語でリンクを投稿した別のユーザーの数に基づいて注文する方法はわかりません。ヘルプは非常に高く評価されます。

+0

'Rails'のどのバージョンを使用していますか? –

答えて

1

私の知る限り、言語には多くのユーザーがリンクを使用しています。したがって、あなたはLanguage

class Language 
    has_many :users, through: :links 
end 

にhas_manyの関連付けを追加し、ユーザーの数によってlanguagesと順番にそれを上usersテーブルを結合する左することができます。

Rails 5left_joinsメソッドを持っているので、それはこれでちょうど実行することができます:あなたはリンクせずに言語を表示したくない場合は

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

left_joinsjoinsで置換することができます。

+0

私は結婚を通して多くのことがあるのだろうと思っていました。これは明らかにしました。ありがとうございました! – RawCode

関連する問題