2016-12-14 8 views
0

Sequel gemを使用してPostgresデータベースに接続しています - プレイリストとトラックはmany_to_many関係になっています。Sequel gemとPostgresとのmany_to_many関連付けを照会するには

再生リストに表示される最も頻繁に再生される上位10個のトラックを検索する最も効果的な方法を巡って私は頭を悩ましています。誰かが私にこれを取り除く方法の例を教えてもらえますか?おそらく

+0

サンプルデータを表示するには、 'order by ... limit' –

答えて

0

結合テーブルのモデルを使用するのが最適:これは2つのクエリを行いますが、それはトラックの結果の配列を人気順であることを確認しますことを

class PlaylistTrack < Sequel::Model(:playlists_tracks) 
    many_to_one :playlist 
    many_to_one :track 

    def self.top10_tracks 
    group_and_count(:track_id). 
     reverse(:count). 
     limit(10). 
     eager(:track). 
     all. 
     map(&:track) 
    end 
end 

注意を。

あなたがしたい場合は、結合テーブルのモデルなしで単一のクエリでそれを行うことができます。

def Track.top10 
    join(:playlists_tracks, :track_id=>:id). 
    group{tracks[:id]}. 
    select_all(:tracks). 
    select_append{count(tracks[:id])}. 
    order{count(tracks[:id]).desc}. 
    limit(10). 
    all 
end 

注それはあなたではない非集計式を選択したので、これは、非標準のSQLを使用していることこれはPostgreSQLで動作します。トラックテーブルのすべての列をグループ化することで、標準SQLでこの作業を行うことができます。

関連する問題