Rails: метод присоединения, если пользователю понравился набор песен - PullRequest
2 голосов
/ 01 ноября 2011

У меня есть следующие модели:

  • Пользователь
  • Плейлист
  • SongLike
  • Песня
  • ...

Когда я запрашиваю список воспроизведения для всех его песен, я возвращаю массив объектов песни.Какой самый эффективный способ узнать, какие из этих песен пользователю «понравились»?Лайки хранятся в модели SongLike:

class SongLike < ActiveRecord::Base
  belongs_to :user
  belongs_to :song, :counter_cache => "likes_count"
end

... это модель песни:

class Song < ActiveRecord::Base
  has_and_belongs_to_many :playlists
  has_many :featured_songs
  has_many :song_likes
  has_many :users, :through => :song_likes
  ...
end

Ответы [ 2 ]

2 голосов
/ 11 ноября 2011

Используйте вашу ассоциацию song_likes вместе с песнями в памяти, а не запрашивайте db несколько раз:

# user.rb
def songs_liked_from(subset)
  like_ids = self.song_likes.where(:song_id => subset.map(&:id)).select(:song_id).map(&:song_id)
  subset.select{|s| liked_ids.include?(s.id) }
end
1 голос
/ 11 ноября 2011

Вы можете поместить индекс на user_id и song_id, который ищется вместе, и, возможно, сделать его уникальным, если это работает для вашей системы.

  def songs_user_liked
    user_liked_songs = []
    songs.each do |song|
      song_like = SongLike.find_by_user_id_and_song_id(#,song)
      if song_like.song_like_count > 0
        user_liked_songs << song
      end
    end
    user_liked_songs
  end
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...