基于另一个模型属性订购 - Ruby

时间:2014-12-03 04:12:35

标签: ruby-on-rails ruby ruby-on-rails-4

我有两个型号。类别和照片。每个类别都有很多照片。

我想订购一个类别对象数组,使其按照Photo模型中的属性进行排序。具体来说,下载照片的次数。

我试图用

之类的东西启动实例变量
@category = Category.active.order('photos.qty_download DESC)

然后我会使用该实例变量列出类别以及每个类别下载的照片数量

Chicago   45
San Fran   32
Boston    23
etc

什么表达式在Rails中有效?

由于

2 个答案:

答案 0 :(得分:2)

让我们假设您的模型看起来像这样:

class Category < ActiveRecord::Base
  has_many :photos
end

class Photo < ActiveRecord::Base
  belongs_to :category
end

我们也假设:

  • 每张照片都有一个qty_download字段,如您所说 问题
  • 每个类别都有一个name字段
  • 目标是根据要求显示类别 每张照片中所有照片的所有qty_download的总和 类
  • 可以完全排除没有相关照片的类别

有了这些假设,你应该能够写

Category.
  joins(:photos).
  group("categories.id, categories.name").
  select("categories.id, categories.name, sum(photos.qty_download) as total_downloads").
  order("total_downloads desc")

请注意,将返回的内容将是&#34; partial&#34;仅包含idnametotal_downloads的类别对象。如果您想要其他类别字段,请将其添加到groupselect子句中。

<强> 更新

较新版本的Postgres允许简化查询:

Category.
  joins(:photos).
  group("categories.id").
  select("categories.*, sum(photos.qty_download) as total_downloads").
  order("total_downloads desc")

请注意,在Postgres的最新版本中,您只需按唯一ID进行分组 - 您不再必须按照要包含在选择中的所有属性进行分组。因此,您现在可以将类别的所有属性包括为categories.*。我会保留原件,因为它(略微)更有效,并且与旧版本的Postgres向后兼容。

答案 1 :(得分:0)

Category.includes(:photos).order(qty_download: :desc).reference(:photos)