Ruby on rails 如何让Rails关联使用某个名称访问另一个名称的模型?

Ruby on rails 如何让Rails关联使用某个名称访问另一个名称的模型?,ruby-on-rails,ruby,activerecord,rails-models,object-relationships,Ruby On Rails,Ruby,Activerecord,Rails Models,Object Relationships,假设我有一个用户模型和一个电影模型以及存储它们的表。假设我想通过添加第三个名为watchlist\u movies的表来添加一个watchlist特性,该表将用户id映射到电影id 我现在想添加一个监视列表\电影模型。我希望能够使用user.watchlist\u电影查询ActiveRecord,并获取电影对象的集合。到目前为止,我已经尝试过(在user.rb中) 及 第一个结果是user.watchlist_movies返回的记录,第二个结果是user.movies返回的电影记录集合。本质上,

假设我有一个用户模型和一个电影模型以及存储它们的表。假设我想通过添加第三个名为watchlist\u movies的表来添加一个watchlist特性,该表将用户id映射到电影id

我现在想添加一个监视列表\电影模型。我希望能够使用user.watchlist\u电影查询ActiveRecord,并获取电影对象的集合。到目前为止,我已经尝试过(在user.rb中)


第一个结果是user.watchlist_movies返回的记录,第二个结果是user.movies返回的电影记录集合。本质上,我希望user.watchlist\u movies返回一组电影记录,因此我希望第一个关系中定义的访问返回第二个关系的内容。如何做到这一点?

您在这里正确地定义了关系,但您可能会遇到期望与Rails的工作方式不一致的情况。如果您的结构是通过WatchlistMovie(一种简单的连接模型)将电影与用户关联,那么您的思路是正确的

记住,你可以随意称呼你的关系:

has_many :watchlist_movie_associations,
  class_name: 'WatchlistMovie'

has_many :watchlist_movies,
  class_name: 'Movie',
  through: :watchlist_movie_associations

我建议不要这样做,因为这与ActiveRecord喜欢命名事物的方式背道而驰。如果它只是让你现在感到困扰,这是可以理解的,但是如果你接受这种风格而不是与之抗争,那么你的应用程序就会更加一致和容易理解。

所以我不清楚你认为建立这种关系的最佳方式是什么。你是说有很多:电影,通过:观察名单?电影是理想的吗?你最初的问题是教科书式的方法,除非你有很好的理由,否则我会避免改变名字。当个人偏好与Rails惯例发生冲突时,通常应该忽略它。一致性会减少未来的惊喜。现在你可能会觉得很奇怪,但大多数Rails开发人员发现你的代码完全符合预期,他们也会这样做。调用
user.watchlist\u movies
并取回电影模型对于不熟悉您的命名约定的人来说真的很困惑。这很公平。如果我走这条路,我甚至应该有一个观察名单的电影模型吗?难道我不能只使用没有模型的联接表,并使用has_和_-allows_-to_-many关联吗?另外,我不想使用user.movies的一个原因是,将来它们可能会有其他列表。他们也会通过其他协会制作电影。如果你和同一个模特有两个或更多的关系,你会想给它起个不同的名字。例如,如果用户被列在电影的信用卡中,也可以喜欢他们。然后你会有两个
has\u many:through
关系,这意味着你需要为它们选择名字。我会选择观看列表上的电影,或者是有信用卡的电影,所以我选择了最后一种方式(用户电影)。唯一的问题是,当我尝试在ActiveRecord查询中调用.include(:movie)时,它会给我一个TypeError,并说它不需要符号,而是一个模块。你知道是什么引起的吗?
has_many :movies, through: watchlist_movies
has_many :watchlist_movie_associations,
  class_name: 'WatchlistMovie'

has_many :watchlist_movies,
  class_name: 'Movie',
  through: :watchlist_movie_associations