【问题标题】:Rails - scopes and many-to-many relationshipsRails - 范围和多对多关系
【发布时间】:2021-09-06 07:28:25
【问题描述】:

我有一个包含电影和流派的 Rails 应用程序,其中电影 has_many 类型(喜剧、动作、戏剧等)和流派 has_many 电影。显然我有一个连接表genres_movies,来跟踪多对多关系。

我正在玩范围以轻松获取没有任何类型的电影 - 但我不确定相应的语法是什么。这样的事情不起作用:

scope :no_genres, -> { joins(:genres).where(genres: { id: nil}) }

(我发现关系数据库令人困惑:)

【问题讨论】:

  • 根据 Rails 版本,您可以使用 left_joins 而不是 joins(旧版本

标签: ruby-on-rails activerecord


【解决方案1】:

如果您不熟悉关系数据库,那么我应该告诉您,当您进行连接时,它会选择匹配数据的结果。因此,当您将电影与流派结合在一起时,结果是由哪里有电影、哪里有流派并且它们匹配。因此,如果电影没有流派,则它不会有匹配的流派,因此不会出现在结果中。

所以你想要的是左边的movies 和右边的genres 的左外连接。左外连接将确保即使是没有流派的电影也在结果中。它将对结果中genres 表的所有值使用NULL。因此,如果您随后使用id: nil 执行where,您将只获得那些没有流派的记录,从而获得所有没有流派的电影。

scope :no_genres, -> { left_joins(:genres).where(genres: { id: nil}) }

【讨论】:

  • 像魅力一样工作 :) ... 是的,我总是对 left_loin 和 outer_join 以及 whathaveyou_join 感到困惑 :) ...所以感谢您的小建议! :)
猜你喜欢
  • 2012-05-10
  • 1970-01-01
  • 2018-04-24
  • 1970-01-01
  • 2013-04-08
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多