Ruby on rails Rails:如果用户喜欢一组歌曲,则加入的方法

Ruby on rails Rails:如果用户喜欢一组歌曲,则加入的方法,ruby-on-rails,activerecord,Ruby On Rails,Activerecord,我有以下型号: 使用者 播放列表 歌曲般的 歌 当我查询一个播放列表中的所有歌曲时,我会得到一系列返回的歌曲对象。找出用户“喜欢”的歌曲的最有效方法是什么?类似项存储在SongLike模型中: class SongLike < ActiveRecord::Base belongs_to :user belongs_to :song, :counter_cache => "likes_count" end class-SongLike“喜欢\u计数” 结束 …这是歌曲

我有以下型号:

  • 使用者
  • 播放列表
  • 歌曲般的
当我查询一个播放列表中的所有歌曲时,我会得到一系列返回的歌曲对象。找出用户“喜欢”的歌曲的最有效方法是什么?类似项存储在SongLike模型中:

class SongLike < ActiveRecord::Base
  belongs_to :user
  belongs_to :song, :counter_cache => "likes_count"
end
class-SongLike“喜欢\u计数”
结束
…这是歌曲模型:

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
classsong:歌曲
...
结束

您可以将正在查找的用户id和歌曲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
def歌曲\u用户\u喜欢
用户喜欢的歌曲=[]
歌曲。每首歌|
song_like=SongLike.find_by_user_id_和_song_id(#,song)
如果song_like.song_like_计数>0

用户喜欢的歌曲利用您的歌曲喜欢关联以及内存中的歌曲,而不是多次查询数据库:

# 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

要使
like\u id.include?
调用更有效,您还可以通过以下操作最小化
like\u id的大小:
like\u id=self.song\u likes.where(:song\u id=>subset.map(&:id))。选择(:song\u id.map(&:song\u id)
。如果一个用户有数百个喜欢,其中一些不在子集范围内,这将影响性能。一个用户可能有数千个喜欢,您能用优化更新答案吗?如果一个用户可能有2000多个喜好,它可用吗?谢谢:)。