2015-05-11 4 views
1

У меня есть модельный плейлист и пользователь модели, оба из которых имеют друг друга друг от друга, через модель PlaylistUser.Как я могу эффективно заказывать загруженные записи?

В моих плейлистах # show action, я хочу распечатать список всех пользователей Playlist, а также первые два плейлиста (упорядоченные по: song_count), связанные с каждым из этих Пользователей. Чтобы сделать этот единственный запрос, я загрузил таблицу плейлистов вместе с пользователями.

Прямо сейчас вот что у меня есть:

плейлистам/show.html.erb

<% @playlist = Playlist.find(params[:id]) %> 
<% @playlist_users = @playlist.users.includes(:playlists) 
<% @playlist_users.each do |user| %> 
    <%= user.name %> 
    <%= user.playlists.order(:song_count).reverse.first.name %> 
    <%= user.playlists.order(:song_count).reverse.second.name %> 
<% end %> 

модели

class User < ActiveRecord::Base 
    has_many :playlist_users 
    has_many :playlists, :through => :playlist_users 
end 

class PlaylistUser < ActiveRecord::Base 
    belongs_to :playlist 
    belongs_to :user 
end 

class Playlist < ActiveRecord::Base 
    has_many :playlist_users 
    has_many :users, :through => :playlist_users 
end 

Когда я удалить заказ, запрос очень быстро. Но с заказом это очень медленно, потому что база данных, по-видимому, должна запрашивать каждый список воспроизведения, прежде чем он сможет их заказать.

Могу ли я заказать плейлисты в исходном запросе?

ответ

2

на самом деле, когда вы делаете:

user.playlists.order(:song_count).reverse 

Вы не рычаги eagerload, вы заново запросов каждый раз.

Благодаря eagerloading у вас есть коллекция в памяти, так что вы можете сортировать его с помощью рубинового метод как своего рода:

user.playlists.sort_by {|pl| -pl.song_count } 
Смежные вопросы