Nav*_*eed 5 postgresql activerecord join ruby-on-rails related-content
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
Run Code Online (Sandbox Code Playgroud)
现在我想得到一个基于匹配类型的相关电影列表(两部电影都是相关的,如果它们都有'喜剧'类型).这些相关电影需要按最大匹配类型排序.
那么这里是样本电影和预期的输出.
#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]
Run Code Online (Sandbox Code Playgroud)
希望问题有意义.
更新:寻找仅SQL解决方案.我不需要将结果缓存在任何其他表中.
加入后需要按照电影id的组数进行排序
resource_genres,看一下下面的纯SQL方法:
双重连接resource_genres表本身以维护自身流派 ID:
def related_movies
Movie.select("movies.*, COUNT(*) AS group_count").
joins(:resource_genres).
joins("JOIN resource_genres rg ON rg.genre_id = resource_genres.genre_id").
where("rg.resource_type = 'Movie'
AND rg.resource_id = ?
AND movies.id != ?", self.id, self.id).
group('movies.id').
order('group_count DESC')
end
Run Code Online (Sandbox Code Playgroud)
在单独的查询中genre_ids从 self 中提取。resource_genres
def related_movies
Movie.select("movies.*, COUNT(*) AS group_count").joins(:resource_genres).
where("resource_genres.genre_id IN (?)
AND movies.id != ?", self.resource_genres.pluck(:genre_id), self.id).
group('movies.id').
order('group_count DESC')
end
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
508 次 |
| 最近记录: |