大佬教程收集整理的这篇文章主要介绍了ruby-on-rails – 按相关的多对多关联计数获取记录,大佬教程大佬觉得挺不错的,现在分享给大家,也给大家做个参考。
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,thriller Movie 4: crime,animation,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解决方案.我不需要将结果缓存在任何其他表中.
方法#1(单个查询)
双重加入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
方法#2(2个查询)
从单独的查询中的self resource_genres中获取genre_ids.
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
以上是大佬教程为你收集整理的ruby-on-rails – 按相关的多对多关联计数获取记录全部内容,希望文章能够帮你解决ruby-on-rails – 按相关的多对多关联计数获取记录所遇到的程序开发问题。
如果觉得大佬教程网站内容还不错,欢迎将大佬教程推荐给程序员好友。
本图文内容来源于网友网络收集整理提供,作为学习参考使用,版权属于原作者。
如您有任何意见或建议可联系处理。小编QQ:384754419,请注明来意。