我正在尝试将每个播放列表的第一首歌曲加入到一系列的播放列表中,并且很难找到一个有效的解决方案.
我有以下型号:
class Playlist < ActiveRecord::Base belongs_to :user has_many :playlist_songs has_many :songs,:through => :playlist_songs end class PlaylistSong < ActiveRecord::Base belongs_to :playlist belongs_to :song end class Song < ActiveRecord::Base has_many :playlist_songs has_many :playlists,:through => :playlist_songs end
我想得到这个:
playlist_name | song_name ---------------------------- chill | baby fun | bffs
我有一个很艰难的时间找到一个有效的方法来通过加入来做到这一点.
更新****
安德拉德(Shane Andrade)带领我走向正确的方向,但我仍然无法得到我所想要的.
这是我能够得到的:
playlists = Playlist.where('id in (1,2,3)') playlists.joins(:playlist_songs) .group('playlists.id') .select('MIN(songs.id) as song_id,playlists.name as playlist_name')
这给了我
playlist_name | song_id --------------------------- chill | 1
这是接近的,但我需要第一首歌曲(根据id)的名字.
解决方法
假设你在Postgresql
Playlist. select("DISTINCT ON(playlists.id) playlists.id,songs.id song_id,playlists.name,songs.name first_song_name"). joins(:songs). order("id,song_id"). map do |pl| [pl.id,pl.name,pl.first_song_name] end