Rails:找到至少共有1部电影的用户(用户通过收视率看电影)

时间:2015-11-25 22:46:04

标签: ruby-on-rails activerecord

以优雅的方式解决这个问题有些困难。

用户可以为电影1或0评分。用户可以通过评级获得许多电影。我正在尝试编写一个实例方法来返回至少有一个正面匹配的用户列表(两个都是评分的电影1)。

e.g。

some_user.potential_matches =>返回将some_user.movi​​e_ratings.where(评级:1)中的至少一个评为1的用户列表

希望这是有道理的。

3 个答案:

答案 0 :(得分:1)

我认为这个班轮可能会为你完成这项任务(可能需要一些调整以匹配你的班级名称等)

User.joins(:movies).where(movies: { id: Movie.joins(:users).where(users: { id: u }).joins(:ratings).where(ratings: { rating: 1 })})

当您尝试更复杂的查询时,我发现从最后开始并继续前进是有帮助的

1)查找评分为== 1

的所有电影

Movie.joins(:ratings).where(ratings: { rating: 1 })

2)仅使用用户u提供评级的电影替换所有电影。在您的情况下,因为您正在查看类User的实例方法,这将是self

Movie.joins(:users).where(users: { id: u }).[INSERT QUERY FROM STEP 1 HERE]

3)最后一步是查找为上述查询返回的电影提供评级的所有用户

User.joins(:movies).where(movies: { id: [INSERT QUERY FROM STEP 2 HERE] })

[编辑] 您可以在末尾添加.uniq以返回一组唯一的用户。

答案 1 :(得分:0)

假设您在构建关联时movie_id模型中有user_idMovieRating,请尝试此方法:

def potential_matches
  # find movie ids the user rated 1
  movie_ids = self.movie_ratings.where(rating: 1).map(&:movie_id)
  # find other users who rated 1 in those movies and get user_ids
  other_user_ids = MovieRating.where(rating: 1).where(movie_id: movie_ids).where.not(user_id: self.id).map(&:user_id).uniq
  # find those users with id 
  other_users = User.where(id: other_user_ids)

  return other_users
end

答案 2 :(得分:0)

在您的用户类中,您可以添加此实例变量:

def users_with_rated_movies_in_common
  User.joins(:movies).where(movies: { id: movies }).where.not(id: self)
end

这基本上抓住了所有评分过电影的用户,评分的电影是当前用户评价的电影。最后,我们不想包含实际用户。

您应该能够将其他条件链接到查询中。