按has_many关联的属性排序

Tom*_*man 2 ruby-on-rails

假设Songs has_many Comments; 我怎么能够:

  1. 从数据库中拉出所有歌曲的列表,按照每个歌曲的评论数量排序?(即,评论最多的歌曲,评论最少的歌曲最后?)
  2. 相同,但按评论创建时间排序?(即,最近创建的评论的歌曲,最近创建的评论的歌曲最后?)

Geo*_*tte 6

1)有几种方法可以做到这一点,最简单的是计数器缓存,你这样做我创建一个列来维持计数和rails会使计数加快速度.在这种情况下,列将是comments_count

songs = Song.all(:order => "comments_count DESC")
Run Code Online (Sandbox Code Playgroud)

或者你可以做一个时髦的查询:

songs = Song.all(:joins => "LEFT JOIN comments ON songs.id = comments.song_id",
                 :select => "song.name, count(*)",
                 :group => "song.name",
                 :order => "count(*) DESC")
Run Code Online (Sandbox Code Playgroud)

使用第二种方法的一些注意事项,您需要在歌曲中选择的任何内容,您需要在group by语句中包含这些内容.如果您只需要带有评论的歌曲,那么您可以:

songs = Song.all(:joins => :comments, 
                 :select => "song.name, count(*)",
                 :group => "song.name",
                 :order => "count(*) DESC")
Run Code Online (Sandbox Code Playgroud)

哪个看起来更好但是因为它有一个内连接你不会得到没有评论的歌曲

2)只是一个包含/加入

songs = Song.all(:include => :comments, :order => "comment.created_at"
Run Code Online (Sandbox Code Playgroud)

我希望这有帮助!