当前位置: 首页 > 面试题库 >

Rails ActiveRecord按联接表关联计数排序

常经赋
2023-03-14
问题内容

我有一个Resource模型可以使用“使行为成为现实”宝石(Github页面)进行投票。投票系统工作正常,但我尝试显示按votes每个页面有多少排序的页面Resource

目前,我的控制器根据标签提取资源,但未排序:

@resources = Resource.where(language_id: "ruby")

如果我使用单个资源并调用“ @
resource.votes.size”,它将返回其拥有的票数。但是,票数是另一张桌子,因此我认为需要进行某种形式的合并,但我不确定如何进行。我需要的是一个ActiveRecord可以这样显示的漂亮的有序集合?

书名-19票

书名-15票

书名-9票

书名-8票


问题答案:

请尝试以下方法:

@resources = Resouce.select("resources.*, COUNT(votes.id) vote_count")
                    .joins(:votes)
                    .where(language_id: "ruby")
                    .group("resources.id")
                    .order("vote_count DESC")

@resources.each { |r| puts "#{r.whatever}  #{r.vote_count}" }

要包含0票的资源,请使用外部联接。如果下面的示例不起作用,则必须更改joins语句以跨正确的关系进行联接。

@resources = Resource.select("resources.*, COUNT(votes.id) vote_count")
                     .joins("LEFT OUTER JOIN votes ON votes.votable_id = resources.id AND votes.votable_type = 'Resource'")
                     .where(language_id: "ruby")
                     .group("resources.id")
                     .order("vote_count DESC")


 类似资料:
  • 问题内容: 我有一个名为的模型。我也有一个名为的模型。A 和一首歌(可以收听很多次)。 在我的模型中,我想定义一个方法,该方法应返回收听次数最多的前5首歌曲。如何使用关系实现这一目标? 我正在使用Rails 3.1。 谢谢! 问题答案: 使用命名范围:

  • 我有一个简单的场景TableA、TableB和JoinTable,它连接了TableA和TableB。我想在TableA中为TableA中的每一行存储JoinTable中具有TableAId的记录的计数。我可以正确地选择它如下: 但是,我很难编写更新查询。我想用这个结果更新TableA.JoinCount。

  • 问题内容: 我不是数据库专家,所以我需要一些有关正在处理的查询的帮助。在我的照片社区项目中,我不仅要显示标签名称和计数器(标签中的图像数量),而且还想显示标签中最受欢迎的图像(最因果),以丰富标签的可视化效果。 表设置如下: 图像表包含基本图像元数据,重要的是因果字段 Imagefile表每个图像包含多个条目,每种格式一个 标签表保存标签定义 Tag_map表将标签映射到图像 在我通常的试验和错误

  • 关联统计 有些时候,并不需要获取关联数据,而只是希望获取关联数据的统计,这个时候可以使用withCount方法进行指定关联的统计。 $list = User::withCount('cards')->select([1,2,3]); foreach($list as $user){ // 获取用户关联的card关联统计 echo $user->cards_count; } 关联统计

  • 问题内容: 给定模型所在的相同场景 我想按收听次数对歌曲进行分组。我的目标是查看歌曲与听音的分布情况。就像是… 这样就可以返回听过4次的歌曲数量。 上面链接问题的公认答案非常接近我,但是我无法按“ songs.listens_count”分组 问题答案: 您正在寻找的内容与标准ActiveRecord查询的映射并不理想。 您可以调用直接SQL来最有效地获取所需内容: 另外,您可以使用ActiveR