Rails ActiveRecord:如何通过超级父视图获取非重复的子记录?

我有四张名为AlbumsSongsSingersSongSingers

 Albums { Id, Name } Songs { Id, AlbumId, Name } Singers { Id, Name } SongSingers { Id, SongId, SingerId } 
  • 专辑有很多歌。
  • 歌曲属于专辑。
  • SongSinger属于Song and Singer。
  • 歌曲和歌手有许多SongSingers。

每首歌可能有相同或不同的歌手。

在View中,如何通过AlbumId获取所有非重复的歌手。

谢谢。

绝对没问题。

  1. 你在追问歌手。 这就是查询的开始。
  2. 您对关联存储的歌曲有条件。 我们很快就会需要它。

     @album.songs 
  3. 加入歌曲和歌手,以便您可以应用上述条件。 注意:你还在挑选歌手! 只是现在你可以在他们的歌曲上放置条件了。

     Singer.joins(:songs) 
  4. 现在应用它:

     Singer.joins(:songs).merge(@album.songs) # It's pretty much the same as this, but more concise: Singer.joins(:songs).merge(songs: {album_id: @album.id}) 
  5. 现在过滤掉重复项:

     Singer.joins(:songs).merge(@album.songs).uniq 

完成。

你可以这样做。

 class Album < ActiveRecord::Base has_many :songs has_many :song_singers, :through => :songs has_many :singers, :through => :song_singers ... end 

在视图中,您现在可以简单地调用它

 @album.singers.uniq