Rails:如何通过

时间:2015-11-24 21:47:12

标签: ruby-on-rails activerecord

我有一个用户模型,一个电影模型和一个MovieRatings模型。用户通过MovieRatings拥有多部电影,反之亦然。

电影评级具有user_id,movie_id和wants_to_see。 wants_to_see是一个布尔值。是否有一种简单的方法来获取用户的电影列表,其中want_to_see = true?

user.movies.where(wants_to_see: true)为我提供了一个AssociationRelation对象。 user.movie_ratings.where(wants_to_see: true)为我提供了一个MovieRating对象列表,然后我需要找到相关的电影。

实现这一目标的最佳方式是什么?

1 个答案:

答案 0 :(得分:1)

你可以通过几种方式实现这一目标。您可以创建一个函数来返回用户想要的电影

class User < ActiveRecord::Base
  has_many :movie_ratings
  has_many :movies, through: :movie_ratings

  def wants_to_see_movies
    self.movies.where(movie_ratings: { wants_to_see: true } )
  end
end

或者,您可以使用has_many为“想看”电影创建额外的关联

class User < ActiveRecord::Base
  has_many :movie_ratings
  has_many :movies, through: :movie_ratings
  has_many :wants_to_see_movies, -> { where(movie_ratings: { wants_to_see: true } ) },
                                 through: :movie_ratings,
                                 source: movie
  end
end

坦率地说,我不确定哪种解决方案更好/更推荐,但在任何一种情况下,当你想获得用户想看的所有电影时,

@movies = @user.wants_to_see_movies