Ruby   发布时间:2022-04-03  发布网站:大佬教程  code.js-code.com
大佬教程收集整理的这篇文章主要介绍了ruby-on-rails – 按相关的多对多关联计数获取记录大佬教程大佬觉得挺不错的,现在分享给大家,也给大家做个参考。
Scnerio:

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解决方案.我不需要将结果缓存在任何其他表中.

解决方法

您需要在加入后按电影ID的组计数进行排序
resource_genres,看看下面的纯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,请注明来意。