如何查询与Sequel gem和Postgres的many_to_many关联

时间:2016-12-14 00:25:48

标签: ruby postgresql sequel

我正在使用Sequel gem连接到我的Postgres数据库 - 我有播放列表和曲目,它们有很多关系。

我很难绕过最有效的方式来查询播放列表中看到的前10个最常见的曲目。有人能给我一个如何解决这个问题的例子吗?

1 个答案:

答案 0 :(得分:0)

可能最好将模型用于连接表:

class PlaylistTrack < Sequel::Model(:playlists_tracks)
  many_to_one :playlist
  many_to_one :track

  def self.top10_tracks
    group_and_count(:track_id).
      reverse(:count).
      limit(10).
      eager(:track).
      all.
      map(&:track)
  end
end

请注意,这会执行两次查询,但会确保生成的曲目数组按受欢迎程度排序。

如果您愿意,可以在没有连接表模型的单个查询中执行此操作:

def Track.top10
  join(:playlists_tracks, :track_id=>:id).
    group{tracks[:id]}.
    select_all(:tracks).
    select_append{count(tracks[:id])}.
    order{count(tracks[:id]).desc}.
    limit(10).
    all
end

请注意,这使用非标准SQL,因为它选择了非分组的非聚合表达式,但它在PostgreSQL中有效。通过对track表中的所有列进行分组,您可以使用标准SQL。