【发布时间】:2015-01-20 15:36:18
【问题描述】:
场景:
https://www.funtraker.com 正在列出电影、电视节目和游戏。在每个资源(电影、电视节目等)的放映页面上,我们要列出相关资源。
架构:
class Movie < AR::Base
has_many :resource_genres, as: :resource
has_many :genres, through: :resource_genres
end
class ResourceGenre
belongs_to :resource, polymorphic: true
end
现在我想获取基于匹配类型的相关电影列表(如果两部电影都具有“喜剧”类型,则两部电影是相关的)。这些相关电影需要按照匹配类型的最大数量排序。
这里是示例电影和预期的输出。
#Input
Movie Genres
Movie 1: horror, comedy, action, war
Movie 2: action, thriller, crime, animation
Movie 3: comedy, war, action, thriller
Movie 4: crime, animation, action, war
#Expected output
movie1.related_movies => [ movie3, movie2 ]
movie4.related_movies => [ movie2, remaining-three-movies-in-any-order ]
movie3.related_movies => [ movie1, movie2, movie4]
希望问题有意义。
更新:寻找仅 SQL 的解决方案。我不需要将结果缓存在任何其他表中。
【问题讨论】:
-
您将使用多少条记录?对几百部电影使用 ActiveRecord 可以正常工作,但此查询无法扩展。
-
@eabraham 实际上我只需要前 10 条相关记录 :)
-
前 10 名是指前 10 名吗?
-
@eabraham 是的,前 10 名表示前 10 个条目。参赛作品将按最大匹配数排序,因此前十名也将是前 10 名:)
标签: ruby-on-rails postgresql join activerecord related-content