2

アルバムのコレクションがあり、各アルバムには曲があります。

最も再生された曲があり、これらのアルバム内で最も再生された曲のみを参照しているすべてのアルバムをフィルター処理したいと考えています。

何かのようなもの

Album.includes(:songs).order("songs.played_count DESC").limit(10)

ただし、これは曲ではなくアルバムを制限します。

そのためには、最も再生された曲とアルバムを 10 個欲しいです。

のような反対側から行く場合

Song.includes(:album).order("songs.played_count DESC").limit(10)

すべての曲を入手しましたが、アルバムを受け取りたいです。この例では、曲を調べてアルバムのコレクションを作成し、各アルバム セットに対して選択した曲のみを設定する必要があります。

それを達成するためのより良い方法はありますか?

マイモデル

Artist 
  name 
  has_many :albums

Album 
  title 
  year
  has_many :songs
  belongs_to :artist 

Song 
  title 
  played_count 
  new
  belongs_to :album

アップデート

私が期待する結果の例。

トップ10曲

Bad Religion - The New America  | I Love My Computer 
Linkin Park - Living Things     | Caste of Glass
Linkin Park - Living Things     | Skin to Bone
Kiss - Monster                  | Freak 
Within Tempt. - Q Music Session | Titanium
Sunrise Avanue - On The Way ..  | Fairytale Gone Bad
Linkin Park - Living Things     | Roads Untravelled
Within Tempt. - Q Music Session | Radioactive         

期待される結果

Album <Bad Religion - The New America>  
   Song <I Love My Computer>

Album <Linkin Park - Living Things>
  Song <Castle of Glass>
  Song <Skin to Bone>
  Song <Roads Untravelled>

Album <Kiss - Monster>
  Song <Freak>

Album <Within Tempt. - Q Music Session>
  Song <Titanium>
  Song <Radioactive>

Album <Sunrise Avanue - On The Way ..>
  Song <Fairytable Gone Bad>

簡単なクエリは次のようになります

SELECT albums.*, songs.* FROM albums 
LEFT JOIN songs 
   ON songs.album_id = albums.id 
ORDER BY songs.most_played 
LIMIT 10 

そして、このクエリは 10 個のオブジェクトを返します。このクエリに基づいて、それらを曲を含むアルバムに変換する必要があります。

質問をクリアしたことを願っています。

4

1 に答える 1

1

Rails Docから:

:limit オプションを指定してアソシエーションをイーガー ロードすると、アソシエーションは無視され、関連するすべてのオブジェクトが返されます。

代わりに、これを試してください:

Album 
  title 
  year
  has_many :songs
  has_many :most_played_songs, -> { order('played_count DESC').limit(10) }, :class_name => 'Song'
  belongs_to :artist 
于 2013-11-14T13:35:12.837 に答える