我有一个包含电影和流派的Rails应用程序,其中电影有很多流派(喜剧、动作、戏剧等(,流派有很多电影。显然,我有一个联接表genres_mvies,用来跟踪多对多关系。
我在玩范围游戏,可以轻松地获得没有任何类型的电影,但我不确定相应的语法是什么
scope :no_genres, -> { joins(:genres).where(genres: { id: nil}) }
(我发现关系数据库令人困惑:(
如果您不熟悉关系数据库,那么我应该告诉您,当您执行联接时,它会选择有匹配数据的结果。所以,当你把不同类型的电影结合起来时,结果是由哪里有电影,哪里有类型,它们匹配组成的。因此,如果一部电影没有类型,它就不会有匹配的类型,所以它不会出现在结果中。
所以你想要的是左边的movies
和右边的genres
的左外连接。左边的外部连接将确保即使是一部没有类型的电影也会出现在结果中。它将对结果中genres
表的所有值使用NULL。因此,如果你用id: nil
做where
,你将只得到那些没有流派的唱片,从而得到所有没有流派的电影。
scope :no_genres, -> { left_joins(:genres).where(genres: { id: nil}) }