Rails:如何通过 has_many 进行优雅的调用

Posted

技术标签:

【中文标题】Rails:如何通过 has_many 进行优雅的调用【英文标题】:Rails: how to make elegant calls with has_many through 【发布时间】:2015-11-24 21:47:11 【问题描述】:

我有一个 User 模型、一个 Movie 模型和一个 MovieRatings 模型。用户通过 MovieRatings 拥有_many Movies,反之亦然。

电影分级具有 user_id、movie_id 和 Wants_to_see。 want_to_see 是一个布尔值。有没有一种简单的方法可以获取用户想要的电影列表,其中 want_to_see = true?

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

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

【问题讨论】:

【参考方案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

【讨论】:

太棒了,谢谢!我不确定我的关联设置中是否遗漏了什么 没问题!我很乐意提供帮助。

以上是关于Rails:如何通过 has_many 进行优雅的调用的主要内容,如果未能解决你的问题,请参考以下文章

如何通过rails中的关联定义has_many

如何区分相似的has_many:通过Rails中的关联?

Rails中如何通过对象同时保存多个has_many?

如何将记录添加到has_many:通过rails中的关联

Rails has_many,如何实现嵌套关联?

带有has_many的Rails嵌套表单:通过,如何编辑连接模型的属性?