加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 百科 > 正文

ruby-on-rails – 从一个有很多通过关联获取第一个关联

发布时间:2020-12-16 21:33:51 所属栏目:百科 来源:网络整理
导读:我正在尝试将每个播放列表的第一首歌曲加入到一系列的播放列表中,并且很难找到一个有效的解决方案. 我有以下型号: class Playlist ActiveRecord::Base belongs_to :user has_many :playlist_songs has_many :songs,:through = :playlist_songsendclass Play
我正在尝试将每个播放列表的第一首歌曲加入到一系列的播放列表中,并且很难找到一个有效的解决方案.

我有以下型号:

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

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读