在rails中选择元素子集及其子元素

时间:2013-11-14 13:27:27

标签: ruby-on-rails ruby activerecord associations rails-postgresql

我有一系列专辑,每张专辑都有歌曲。

我想过滤所有播放歌曲最多的专辑,而这些专辑内部只能播放播放次数最多的歌曲。

这样的东西
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

更新

我期望的结果示例。

十大歌曲

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个对象,我需要根据此查询将其转换为包含其歌曲的专辑

我希望我能解决这个问题。

1 个答案:

答案 0 :(得分: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