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 文档

如果您使用指定的 :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 回答